GLTypes.pas 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. unit GLTypes;
  2. interface
  3. uses
  4. WebGL, Math, SysUtils;
  5. type
  6. TScalar = double;
  7. TJSFloat32 = double;
  8. TJSFloat32List = array of TJSFloat32;
  9. type
  10. TVec2 = record
  11. x, y: TScalar;
  12. end;
  13. type
  14. TVec3 = record
  15. x, y, z: TScalar;
  16. end;
  17. type
  18. TRGBAb = array of GLubyte;
  19. TRGBAf = array of TScalar;
  20. { Vec3 }
  21. function V3(x, y, z: TScalar): TVec3;
  22. function ToFloats(v: TVec3): TJSFloat32List; overload;
  23. function VecStr(v: TVec3): string; overload;
  24. procedure Show (v: TVec3);
  25. // math functions since we don't have advanced records
  26. function Add (v: TVec3; amount: TScalar): TVec3; overload;
  27. function Add (v: TVec3; amount: TVec3): TVec3; overload;
  28. function Subtract (v: TVec3; amount: TScalar): TVec3; overload;
  29. function Subtract (v: TVec3; amount: TVec3): TVec3; overload;
  30. function Multiply (v: TVec3; amount: TScalar): TVec3; overload;
  31. function Multiply (v: TVec3; amount: TVec3): TVec3; overload;
  32. function Divide (v: TVec3; amount: TScalar): TVec3; overload;
  33. function Divide (v: TVec3; amount: TVec3): TVec3; overload;
  34. function Sum (v: TVec3): TScalar; overload;
  35. function Magnitude(v: TVec3): TScalar; overload;
  36. function SquaredLength (v: TVec3): TScalar; overload;
  37. function Normalize (v: TVec3): TVec3; overload;
  38. function Dot (v: TVec3; point: TVec3): TScalar; overload;
  39. function Cross (v: TVec3; point: TVec3): TVec3; overload;
  40. { Vec2 }
  41. function V2(x, y: TScalar): TVec2;
  42. function ToFloats(v: TVec2): TJSFloat32List; overload;
  43. function RGBAb(r, g, b, a: GLubyte): TRGBAb;
  44. function RGBAf(r, g, b, a: TScalar): TRGBAf;
  45. implementation
  46. {=============================================}
  47. {@! ___Vec2___ }
  48. {=============================================}
  49. function V2(x, y: TScalar): TVec2;
  50. begin
  51. result.x := x;
  52. result.y := y;
  53. end;
  54. function ToFloats(v: TVec2): TJSFloat32List;
  55. begin
  56. SetLength(result, 2);
  57. result[0] := v.x;
  58. result[1] := v.y;
  59. end;
  60. {=============================================}
  61. {@! ___Vec3___ }
  62. {=============================================}
  63. function V3(x, y, z: TScalar): TVec3;
  64. begin
  65. result.x := x;
  66. result.y := y;
  67. result.z := z;
  68. end;
  69. function Add (v: TVec3; amount: TScalar): TVec3;
  70. begin
  71. result := V3(v.x + amount, v.y + amount, v.z + amount);
  72. end;
  73. function Add (v: TVec3; amount: TVec3): TVec3;
  74. begin
  75. result := V3(v.x + amount.x, v.y + amount.y, v.z + amount.z);
  76. end;
  77. function Subtract (v: TVec3; amount: TScalar): TVec3;
  78. begin
  79. result := V3(v.x - amount, v.y - amount, v.z - amount);
  80. end;
  81. function Subtract (v: TVec3; amount: TVec3): TVec3;
  82. begin
  83. result := V3(v.x - amount.x, v.y - amount.y, v.z - amount.z);
  84. end;
  85. function Multiply (v: TVec3; amount: TScalar): TVec3;
  86. begin
  87. result := V3(v.x * amount, v.y * amount, v.z * amount);
  88. end;
  89. function Multiply (v: TVec3; amount: TVec3): TVec3;
  90. begin
  91. result := V3(v.x * amount.x, v.y * amount.y, v.z * amount.z);
  92. end;
  93. function Divide (v: TVec3; amount: TScalar): TVec3;
  94. begin
  95. result := V3(v.x / amount, v.y / amount, v.z / amount);
  96. end;
  97. function Divide (v: TVec3; amount: TVec3): TVec3;
  98. begin
  99. result := V3(v.x / amount.x, v.y / amount.y, v.z / amount.z);
  100. end;
  101. function Sum (v: TVec3): TScalar;
  102. begin
  103. result := v.x + v.y + v.z;
  104. end;
  105. function Magnitude(v: TVec3): TScalar;
  106. begin
  107. result := Sqrt(Power(v.x, 2) + Power(v.y, 2) + Power(v.z, 2));
  108. end;
  109. function SquaredLength (v: TVec3): TScalar;
  110. begin
  111. result := Sqr(v.x) + Sqr(v.y) + Sqr(v.z);
  112. end;
  113. function Normalize (v: TVec3): TVec3;
  114. begin
  115. result := Divide(v, Magnitude(v));
  116. end;
  117. function Dot (v: TVec3; point: TVec3): TScalar;
  118. begin
  119. result := (v.x * point.x) + (v.y * point.y) + (v.z * point.z);
  120. end;
  121. function Cross (v: TVec3; point: TVec3): TVec3;
  122. begin
  123. result.x := (v.y * point.z) - (v.z * point.y);
  124. result.y := (v.z * point.x) - (v.x * point.z);
  125. result.z := (v.x * point.y) - (v.y * point.x);
  126. end;
  127. function ToFloats(v: TVec3): TJSFloat32List;
  128. begin
  129. SetLength(result, 3);
  130. result[0] := v.x;
  131. result[1] := v.y;
  132. result[2] := v.z;
  133. end;
  134. function VecStr(v: TVec3): string;
  135. begin
  136. result := '{'+FloatToStr(v.x)+','+FloatToStr(v.y)+','+FloatToStr(v.z)+'}';
  137. end;
  138. procedure Show (v: TVec3);
  139. begin
  140. writeln('{',v.x,',',v.y,',',v.z,'}');
  141. end;
  142. {=============================================}
  143. {@! ___Colors___ }
  144. {=============================================}
  145. function RGBAb(r, g, b, a: GLubyte): TRGBAb;
  146. begin
  147. result[0] := r;
  148. result[1] := g;
  149. result[2] := b;
  150. result[3] := a;
  151. end;
  152. function RGBAf(r, g, b, a: GLfloat): TRGBAf;
  153. begin
  154. result[0] := r;
  155. result[1] := g;
  156. result[2] := b;
  157. result[3] := a;
  158. end;
  159. end.