Skip to content

Instantly share code, notes, and snippets.

@XProger
XProger / cuteSort.glsl
Created November 27, 2015 08:59
sort 3 floats
vec3 cuteSort(vec3 n) {
float a = min(min(n.x, n.y), n.z);
float b = max(max(n.x, n.y), n.z);
return vec3(a, n.x + n.y + n.z - a - b, b);
}
@XProger
XProger / genCubeStrip.c
Last active November 27, 2015 09:02
14 vertices cube (TriStrip)
b = 1 << i;
x = (0x287A & b) != 0
y = (0x02AF & b) != 0
z = (0x31E3 & b) != 0
@XProger
XProger / blend_mmx.asm
Created May 4, 2015 16:31
MMX: fast integer alpha blending
macro CANVAS_SET_ALPHA col { ; prepare mmx registers (alpha) by col (0xAAxxxxxx)
push col
shr col, 24
pxor mm5, mm5
movd mm7, col
pshufw mm7, mm7, 0
neg col
add col, 256
movd mm6, col
pshufw mm6, mm6, 0
@XProger
XProger / powf_fast.c
Last active January 10, 2024 19:33
fast powf function (IEEE-754 hack)
float powf_fast(float a, float b) {
union { float d; int x; } u = { a };
u.x = (int)(b * (u.x - 1064866805) + 1064866805);
return u.d;
}
mode out color out alpha
-------------- -------------- -----------
layer/over: ( sc+(1-sa)*dc , sa+da-sa*da )
multiply: ( sc*dc , sa+da-sa*da )
screen: ( sa*da - (da-dc)*(sa-sc) , sa+da-sa*da )
lighten: ( max(sa*dc,sc*da) , sa+da-sa*da )
darken: ( min(sa*dc,sc*da) , sa+da-sa*da )
add: ( min(dc+sc,1) , min(sa+da,1) )
subtract: ( max(dc-sc,0) , min(sa+da,1) )
difference: ( abs(sa*dc-sc*da) , sa+da-sa*da )
@XProger
XProger / lines_count_regexp.txt
Last active September 15, 2015 20:34
lines count regexp
\S+\s*\r\n
@XProger
XProger / blend.cpp
Created October 14, 2014 20:33
Fast integer alpha blending
uint32 blend(uint32 color1, uint32 color2, uint8 alpha) {
uint32 rb = color1 & 0xff00ff;
uint32 g = color1 & 0x00ff00;
rb += ((color2 & 0xff00ff) - rb) * alpha >> 8;
g += ((color2 & 0x00ff00) - g) * alpha >> 8;
return (rb & 0xff00ff) | (g & 0xff00);
}
@XProger
XProger / mat4.pas
Created August 26, 2014 07:18
Simple float4x4 matrix operations
TMat4f = {$IFDEF FPC} object {$ELSE} record {$ENDIF}
private
function GetPos: TVec3f; // https://gist.github.com/XProger/da9a74ae8b37905b421a
procedure SetPos(const v: TVec3f);
function GetRot: TQuat; // https://gist.github.com/XProger/def254d40a237cc0f0b2
procedure SetRot(const q: TQuat);
public
e00, e10, e20, e30,
e01, e11, e21, e31,
e02, e12, e22, e32,
@XProger
XProger / quat.pas
Created August 26, 2014 07:13
Quaternion & Dual Quaternion math
TQuat = {$IFDEF FPC} object {$ELSE} record {$ENDIF}
x, y, z, w : Single;
{$IFNDEF FPC}
class operator Equal(const q1, q2: TQuat): Boolean;
class operator Add(const q1, q2: TQuat): TQuat;
class operator Subtract(const q1, q2: TQuat): TQuat;
class operator Multiply(const q: TQuat; x: Single): TQuat;
class operator Multiply(const q1, q2: TQuat): TQuat;
class operator Multiply(const q: TQuat; const v: TVec3f): TVec3f;
{$ENDIF}
@XProger
XProger / vec3.pas
Created August 26, 2014 07:08
Simple float3 vector operations
TVec3f = {$IFDEF FPC} object {$ELSE} record {$ENDIF}
x, y, z : Single;
{$IFNDEF FPC}
class operator Equal(const a, b: TVec3f): Boolean;
class operator Add(const a, b: TVec3f): TVec3f;
class operator Subtract(const a, b: TVec3f): TVec3f;
class operator Multiply(const a, b: TVec3f): TVec3f;
class operator Multiply(const v: TVec3f; x: Single): TVec3f;
{$ENDIF}
function Dot(const v: TVec3f): Single;