GTYPES.PAS 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. Unit GTypes;
  2. Interface
  3. Uses UVector,Matrices;
  4. CONST
  5. vecsize = sizeof(tVec);
  6. type
  7. float = double;
  8. OBJId = (F_OBJ_SPHERE,F_LIGHT_OMNI,F_VIEWPORT,F_AMBIENT,F_OBJ_SURF_PLANE,
  9. F_NULL,F_CAMERA,F_TRI_PLANE,F_TRI,F_QUAD,F_TRANSLATE,F_ROTATE,
  10. F_SCALE,F_SPOTLIGHT,F_TEXTURE,F_INTER_SPHERE,F_CONE);
  11. RGB = record
  12. R, G, B : float;
  13. end;
  14. BRGB = record
  15. B,G,R : byte;
  16. end;
  17. PPlane = ^TPlane;
  18. TPlane = record
  19. N : tVec;
  20. D : float;
  21. end;
  22. PSurfDesc = ^TSurfDesc;
  23. TSurfDesc = record
  24. Kd, Ks, Ns : float;
  25. {
  26. Kd - Š®íä䍿¨¥­â à áá¥ï­¨ï
  27. Ks - Š®íä䍿¨¥­â ®âà ¦¥­¨ï
  28. Ns - Š®íä䍿¨¥­â ¢¨¤  ®âà ¦¥­¨ï
  29. }
  30. end;
  31. PBitPlane = ^TBitPlane;
  32. TBitPlane = array [0..16384] of BRGB;
  33. PTexture = ^TTexture;
  34. TTexture = object
  35. SizeX : word;
  36. SizeY : word;
  37. Bits : PBitPlane;
  38. Name : string[13];
  39. Constructor Init(sx,sy:word);
  40. Procedure LoadTGA(fname:string);
  41. Destructor Done;virtual;
  42. end;
  43. PRay = ^TRay;
  44. TRay = object
  45. Org : TVec;
  46. Dir : TVec;
  47. Constructor Init(aOrg, aDir : tVec);
  48. Procedure GetPoint(var aP : tVec; aT : float);
  49. end;
  50. Procedure SetColor(var aCol : RGB;aR,aG,aB:float);
  51. Procedure SetPlane(var P : TPLane; aV1, aV2, aV3:tVec);
  52. Function Pack24(aCol : RGB):LongInt;
  53. Procedure LoadRGB(var F:FILE;var aCol:RGB);
  54. Procedure SaveRGB(var F:FILE;aCol:RGB);
  55. Procedure CalcTransform(var aT:TTRANSFORM;aV1,aV2,aV3:tVec;r,len:real);
  56. Procedure CAddMul(var aC:RGB;aM:RGB; mul : float);
  57. Implementation
  58. {TRay}
  59. Constructor TRay.Init;
  60. begin
  61. Org := aOrg;
  62. Dir := aDir;
  63. end; {TRay.Init}
  64. {-----------------------------}
  65. Procedure TRay.GetPoint;
  66. begin
  67. VLinear(aP,Org,Dir,1,aT);
  68. end;{TRay.GetPoint}
  69. {TTexture}
  70. Constructor TTexture.Init;
  71. begin
  72. SizeX := sx;
  73. SizeY := sy;
  74. if (Sx*SY > 16384) then
  75. begin
  76. WriteLn('Too large texture');
  77. Halt(206);
  78. end;
  79. GetMem(Bits,SizeX*SizeY*3);
  80. FillChar(Bits^,SizeX*SizeY*3,0)
  81. end;
  82. Destructor TTexture.Done;
  83. begin
  84. FreeMem(Bits,SizeX*SizeY*3);
  85. end;
  86. Procedure TTexture.LoadTGA;
  87. var
  88. F : FILE;
  89. CC : BRGB;
  90. nc : boolean;
  91. i,x,y : word;
  92. tmp : longint;
  93. begin
  94. Name := FNAme;
  95. nc := false;
  96. Assign(F,Fname);
  97. {$I-}
  98. Reset(f,1);
  99. {$I+}
  100. if IOResult <> 0 then
  101. begin
  102. WriteLn('Texture file ',fname,' not found');
  103. Halt(201);
  104. end;
  105. BlockRead(F,TMP,4);
  106. if tmp <> $20000 then
  107. begin
  108. WriteLn('Texture file not TGA: ',fname);
  109. Close(F);
  110. Halt(202);
  111. end;
  112. for i := 1 to 2 do
  113. begin
  114. BlockRead(F,TMP,4);
  115. if (tmp <> 0) and (tmp<>$18000000) then
  116. begin
  117. WriteLn('Texture file not TGA: ',fname);
  118. Close(F);
  119. Halt(202);
  120. end;
  121. end;
  122. blockread(f,i,2); if i <> SizeX then nc := true; x := i;
  123. blockread(f,i,2); if i <> SizeY then nc := true; y := i;
  124. blockread(f,i,2);
  125. if i <> 24 then
  126. begin
  127. WriteLn('Texture file error bitplane: ',fname);
  128. Close(F);
  129. Halt(204);
  130. end;
  131. if NC then
  132. begin
  133. if (X*Y > 16384) then
  134. begin
  135. WriteLn('Too large texture: ',fname);
  136. Halt(206);
  137. end;
  138. FreeMem(Bits,SizeX*SizeY*3);
  139. GetMem(Bits,X*Y*3);
  140. FillChar(Bits^,SizeX*SizeY*3,0);
  141. SizeX:=X;
  142. SizeY:=Y;
  143. end;
  144. for y := SizeY-1 downto 0 do
  145. for x := 0 to SizeX-1 do
  146. begin
  147. BlockRead(F,CC,3);
  148. Bits^[y*SizeX+X] := CC;
  149. end;
  150. Close(F);
  151. end;
  152. {RGB}
  153. Procedure SetColor;
  154. begin
  155. with aCol do begin R:=aR;G:=aG;B:=aB;end;
  156. end;{RGB.Init}
  157. Function Pack24;
  158. var
  159. rr,gg,bb : longint;
  160. begin
  161. if aCol.R > 1.0 then rr := 255 else rr:=round(aCol.R*255);
  162. if aCol.G > 1.0 then gg := 255 else gg:=round(aCol.G*255);
  163. if aCol.B > 1.0 then bb := 255 else bb:=round(aCol.B*255);
  164. Pack24:=(rr shl 16) + (gg shl 8) + bb;
  165. end;{RGB.Pack24}
  166. Procedure LoadRGB(var F:FILE;var aCol:RGB);
  167. begin
  168. BlockRead(F,aCol,sizeof(float)*3);
  169. end;
  170. Procedure SaveRGB(var F:FILE;aCol:RGB);
  171. begin
  172. BlockWrite(F,aCol,sizeof(float)*3);
  173. end;
  174. Procedure CAddMul(var aC:RGB;aM:RGB; mul : float);
  175. begin
  176. aC.R := aC.R + aM.R * mul;
  177. aC.G := aC.G + aM.G * mul;
  178. aC.B := aC.B + aM.B * mul;
  179. end;
  180. Procedure SetPlane(var P : TPLane; aV1, aV2, aV3:tVec);
  181. var
  182. u,v : tVec;
  183. begin
  184. VLinear(u,aV1,aV2,1,-1);
  185. VLinear(v,aV3,aV2,1,-1);
  186. VCross(P.N,u,v);
  187. VNorm(P.N,1);
  188. P.D := -VDot(P.N,aV1);
  189. end;
  190. Procedure CalcTransform;
  191. var
  192. zed : TPLane;
  193. v2,v3 : tVec;
  194. tr2 : TTRANSFORM;
  195. begin
  196. SetPlane(Zed,aV1,aV2,aV3);
  197. Compute_Coordinate_Transform(aT,aV1,Zed.N,r,len);
  198. MInvTransPoint(av1,av1,aT);
  199. MInvTransPoint(av2,av2,aT);
  200. VLinear(v2,aV2,aV1,1,-1);
  201. VNorm(v2,1);
  202. VSet(v3,0,0,1);
  203. Compute_Axis_Rotation_Transform(tr2,v3,-ArcCos(v2.X));
  204. Compose_Transforms(aT,tr2);
  205. end; {CalcTransform}
  206. {-----------------------}
  207. end.