InpSet.pl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. #c:\Perl\bin\Perl.exe -w
  2. $TRAHeader = "\013Rod'sTracer";
  3. $curver = 0x00010001;
  4. %OBJId = ('obj_sphere',0,'light_omni',1,'viewport',2,'ambient',3,'obj_plane',4,
  5. 'null',5,'camera',6,'tri_plane',7,'tri',8,'quad',9,'translate',10,
  6. 'rotate',11,'scale',12,'spot',13,'texture',14,'intersphere',15,'cone',16);
  7. if (@ARGV < 1 )
  8. {
  9. die "Usage: InpSet.pl <infile.txt> [outfile.tra]\n";
  10. }
  11. if (!-f $ARGV[0])
  12. {
  13. die "Error opening $ARGV[0]\n";
  14. }
  15. $INname = $ARGV[0];
  16. $ARGV[0] =~ /(.+)\../;
  17. $OUTname = $1.'.tra';
  18. if (defined $ARGV[1])
  19. {
  20. $OUTname = $ARGV[1]
  21. }
  22. open IN, "<$INname" ||
  23. die "Error opening $INname:$!\n";
  24. open OUT, ">$OUTname" ||
  25. die "Error opening $OUTname:$!\n";
  26. print OUT $TRAHeader;
  27. print OUT pack('L',$curver);
  28. while (<IN>)
  29. {
  30. chomp;
  31. next if (/^$/ || /^\s*#/);
  32. /^\s*sphere\s*\{/i && loadSphere();
  33. /^\s*((cone)||(cyl))\s*\{/i && loadCone();
  34. /^\s*ambient\s*\{/i && loadAmbient();
  35. /^\s*plane\s*\{/i && loadPlane();
  36. /^\s*viewport\s*\{/i && loadViewport();
  37. /^\s*camera\s*\{/i && loadCamera();
  38. /^\s*omni\s*\{/ && loadOmni();
  39. /^\s*tri_plane\s*\{/ && loadTriPlane();
  40. /^\s*tri\s*\{/ && loadTri();
  41. /^\s*quad\s*\{/ && loadQuad();
  42. /^\s*texture\s*\{/ && loadTexture();
  43. /^\s*rotate\s*\{/ && loadRotate();
  44. /^\s*translate\s*\{/ && loadTranslate();
  45. /^\s*(scale)\s*\{/ && loadScale();
  46. /^\s*intersphere\s*\{/ && loadInterS();
  47. }
  48. close IN;
  49. close OUT;
  50. #----------------------------------------------------------------
  51. sub loadCone {
  52. my(%apex,%base,$apex_rad,$base_rad,%color,%surf);
  53. print "Loading cone/cylinder\n";
  54. while (<IN>)
  55. {
  56. chomp;
  57. next if (/^$/ || /^\s*#/);
  58. /^\s*apex\s*\{/i && loadVec(\%apex,$_);
  59. /^\s*base\s*\{/i && loadVec(\%base,$_);
  60. /^\s*apex_rad\s*\{/i && loadDouble(\$apex_rad,$_);
  61. /^\s*base_rad\s*\{/i && loadDouble(\$base_rad,$_);
  62. if (/radius/i){
  63. loadDouble(\$apex_rad,$_);
  64. $base_rad = $apex_rad;
  65. };
  66. /color/i && loadCol(\%color,$_);
  67. /RGB/i && loadRGB(\%color,$_);
  68. /surface/i && loadSurf(\%surf,$_);
  69. /^\s*\}\s*$/ && last;
  70. }
  71. print OUT pack("C",$OBJId{'cone'});
  72. saveVec(%apex);
  73. saveVec(%base);
  74. saveDouble($apex_rad);
  75. saveDouble($base_rad);
  76. saveRGB(%color);
  77. saveSurf(%surf);
  78. };
  79. sub loadInterS {
  80. my(%color,%surf,$inv,$temp);
  81. $inv = 1;
  82. print "Loading Intersphere\n";
  83. while (<IN>)
  84. {
  85. chomp;
  86. next if (/^$/ || /^\s*#/);
  87. /^\s*inv\s*\{/ && loadDouble(\$inv,$_);
  88. /^\s*color\s*\{/i && loadCol(\%color,$_);
  89. /^\s*RGB\s*\{/i && loadRGB(\%color,$_);
  90. /^\s*surface\s*\{/i && loadSurf(\%surf,$_);
  91. /^\s*sphere\s*\{/i && last;
  92. /^\s*plane\s*\{/i && last;
  93. /^\s*tri_plane\s*\{/ && last;
  94. }
  95. $temp = $_;
  96. print OUT pack("C",$OBJId{'intersphere'});
  97. saveDouble($inv);
  98. saveRGB(%color);
  99. saveSurf(%surf);
  100. $_ = $temp;
  101. {
  102. /^\s*sphere\s*\{/i && loadSphere();
  103. /^\s*plane\s*\{/i && loadPlane();
  104. /^\s*tri_plane\s*\{/ && loadTriPlane();
  105. /^\s*\}\s*$/ && last;
  106. <IN>;
  107. chomp;
  108. redo;
  109. }
  110. };
  111. sub loadTexture {
  112. my ($count,$fname,$rad,$len);
  113. ($count,$rad,$len,$fname) = (1,1,1,'suxx');
  114. print "Loading Texture\n";
  115. while (<IN>)
  116. {
  117. chomp;
  118. next if (/^$/ || /^\s*#/);
  119. /^\s*count\s*\{/i && loadDouble(\$count,$_);
  120. /^\s*rad\s*\{/i && loadDouble(\$rad,$_);
  121. /^\s*len\s*\{/i && loadDouble(\$len,$_);
  122. /^\s*name\s*\{\s*\'(.*)\'\s*/ && {$fname = $1};
  123. /^\s*\}\s*$/ && last;
  124. }
  125. print OUT pack("C",$OBJId{'texture'});
  126. print OUT pack("L",$count);
  127. print OUT pack("C",length($fname));
  128. print OUT pack("a12",$fname);
  129. saveDouble($rad);
  130. saveDouble($len);
  131. }
  132. sub loadTranslate {
  133. my(%v,$count);
  134. $count=1;
  135. print "Loading Translate\n";
  136. while (<IN>)
  137. {
  138. chomp;
  139. next if (/^$/ || /^\s*#/);
  140. /^\s*v\s*\{/i && loadVec(\%v,$_);
  141. /^\s*count\s*\{/i && loadDouble(\$count,$_);
  142. /^\s*\}\s*$/ && last;
  143. }
  144. print OUT pack("C",$OBJId{'translate'});
  145. print OUT pack("L",$count);
  146. saveVec(%v);
  147. };
  148. sub loadScale {
  149. my(%pivot,%v,$count);
  150. $count=1;
  151. print "Loading scale\n";
  152. while (<IN>)
  153. {
  154. chomp;
  155. next if (/^$/ || /^\s*#/);
  156. /^\s*v\s*\{/i && loadVec(\%v,$_);
  157. /^\s*pivot\s*\{/i && loadVec(\%pivot,$_);
  158. /^\s*count\s*\{/i && loadDouble(\$count,$_);
  159. /^\s*\}\s*$/ && last;
  160. }
  161. print OUT pack("C",$OBJId{'scale'});
  162. print OUT pack("L",$count);
  163. saveVec(%pivot);
  164. saveVec(%v);
  165. };
  166. sub loadRotate {
  167. my(%pivot,%axis,$angle,$count);
  168. $count=1;
  169. print "Loading Rotation\n";
  170. while (<IN>)
  171. {
  172. chomp;
  173. next if (/^$/ || /^\s*#/);
  174. /^\s*count\s*\{/i && loadDouble(\$count,$_);
  175. /Axis/i && loadVec(\%axis,$_);
  176. /Angle/i && loadDouble(\$angle,$_);
  177. /pivot/i && loadVec(\%pivot,$_);
  178. /^\s*\}\s*$/ && last;
  179. }
  180. print OUT pack("C",$OBJId{'rotate'});
  181. print OUT pack("L",$count);
  182. saveVec(%pivot);
  183. saveVec(%axis);
  184. saveDouble($angle);
  185. };
  186. sub loadCamera {
  187. my(%Org,%Dest,$roll,$fov,$xtoy);
  188. print "Loading camera\n";
  189. $xtoy = 1.0;
  190. $fov = 60.0;
  191. $Org{'Z'} = -320;
  192. while (<IN>)
  193. {
  194. chomp;
  195. next if (/^$/ || /^\s*#/);
  196. /Origin/i && loadVec(\%Org,$_);
  197. /Target/i && loadVec(\%Dest,$_);
  198. /Roll/i && loadDouble(\$roll,$_);
  199. /Fov/i && loadDouble(\$fov,$_);
  200. /XtoY/i && loadDouble(\$xtoy,$_);
  201. /^\s*\}\s*$/ && last;
  202. }
  203. print OUT pack("C",$OBJId{'camera'});
  204. saveVec(%Org);
  205. saveVec(%Dest);
  206. saveDouble($roll);
  207. saveDouble($fov);
  208. saveDouble($xtoy);
  209. };
  210. sub loadViewPort {
  211. my(%LLpos,%CamPos,%Up,%Right);
  212. print "Loading viewport\n";
  213. while (<IN>)
  214. {
  215. chomp;
  216. next if (/^$/ || /^\s*#/);
  217. /LLpos/i && loadVec(\%LLpos,$_);
  218. /CamPos/i && loadVec(\%CamPos,$_);
  219. /Up/i && loadVec(\%Up,$_);
  220. /Right/i && loadVec(\%Right,$_);
  221. /^\s*\}\s*$/ && last;
  222. }
  223. print OUT pack("C",$OBJId{'viewport'});
  224. saveVec(%CamPos);
  225. saveVec(%LLpos);
  226. saveVec(%Up);
  227. saveVec(%Right);
  228. };
  229. sub loadPlane {
  230. my(%norm,$dist,%color,%surf);
  231. print "Loading Plane\n";
  232. while (<IN>)
  233. {
  234. chomp;
  235. next if (/^$/ || /^\s*#/);
  236. /norm/i && loadVec(\%norm,$_);
  237. /dist/i && loadDouble(\$dist,$_);
  238. /color/i && loadCol(\%color,$_);
  239. /RGB/i && loadRGB(\%color,$_);
  240. /surface/i && loadSurf(\%surf,$_);
  241. /^\s*\}\s*$/ && last;
  242. }
  243. print OUT pack("C",$OBJId{'obj_plane'});
  244. saveVec(%norm);
  245. saveDouble($dist);
  246. saveRGB(%color);
  247. saveSurf(%surf);
  248. };
  249. sub loadTriPlane {
  250. my($v1,$v2,$v3,%color,%surf);
  251. print "Loading TriPlane\n";
  252. while (<IN>)
  253. {
  254. chomp;
  255. next if (/^$/ || /^\s*#/);
  256. /v1/i && loadVec(\%v1,$_);
  257. /v2/i && loadVec(\%v2,$_);
  258. /v3/i && loadVec(\%v3,$_);
  259. /color/i && loadCol(\%color,$_);
  260. /RGB/i && loadRGB(\%color,$_);
  261. /surface/i && loadSurf(\%surf,$_);
  262. /^\s*\}\s*$/ && last;
  263. }
  264. print OUT pack("C",$OBJId{'tri_plane'});
  265. saveVec(%v1);
  266. saveVec(%v2);
  267. saveVec(%v3);
  268. saveRGB(%color);
  269. saveSurf(%surf);
  270. };
  271. sub loadTri {
  272. my($v1,$v2,$v3,%color,%surf);
  273. print "Loading Tri\n";
  274. while (<IN>)
  275. {
  276. chomp;
  277. next if (/^$/ || /^\s*#/);
  278. /v1/i && loadVec(\%v1,$_);
  279. /v2/i && loadVec(\%v2,$_);
  280. /v3/i && loadVec(\%v3,$_);
  281. /color/i && loadCol(\%color,$_);
  282. /RGB/i && loadRGB(\%color,$_);
  283. /surface/i && loadSurf(\%surf,$_);
  284. /^\s*\}\s*$/ && last;
  285. }
  286. print OUT pack("C",$OBJId{'tri'});
  287. saveVec(%v1);
  288. saveVec(%v2);
  289. saveVec(%v3);
  290. saveRGB(%color);
  291. saveSurf(%surf);
  292. };
  293. sub loadQuad {
  294. my($v1,$v2,$v3,$v4,%color,%surf);
  295. print "Loading Quad\n";
  296. while (<IN>)
  297. {
  298. chomp;
  299. next if (/^$/ || /^\s*#/);
  300. /v1/i && loadVec(\%v1,$_);
  301. /v2/i && loadVec(\%v2,$_);
  302. /v3/i && loadVec(\%v3,$_);
  303. /v4/i && loadVec(\%v4,$_);
  304. /color/i && loadCol(\%color,$_);
  305. /RGB/i && loadRGB(\%color,$_);
  306. /surface/i && loadSurf(\%surf,$_);
  307. /^\s*\}\s*$/ && last;
  308. }
  309. print OUT pack("C",$OBJId{'quad'});
  310. saveVec(%v1);
  311. saveVec(%v2);
  312. saveVec(%v3);
  313. saveVec(%v4);
  314. saveRGB(%color);
  315. saveSurf(%surf);
  316. };
  317. sub loadSphere {
  318. my(%pos,$rad,%color,%surf);
  319. print "Loading sphere\n";
  320. while (<IN>)
  321. {
  322. chomp;
  323. next if (/^$/ || /^\s*#/);
  324. /pos/i && loadVec(\%pos,$_);
  325. /radius/i && loadDouble(\$rad,$_);
  326. /color/i && loadCol(\%color,$_);
  327. /RGB/i && loadRGB(\%color,$_);
  328. /surface/i && loadSurf(\%surf,$_);
  329. /^\s*\}\s*$/ && last;
  330. }
  331. print OUT pack("C",$OBJId{'obj_sphere'});
  332. saveVec(%pos);
  333. saveDouble($rad);
  334. saveRGB(%color);
  335. saveSurf(%surf);
  336. };
  337. sub loadOmni {
  338. my(%pos,%color);
  339. print "Loading omni\n";
  340. while (<IN>)
  341. {
  342. chomp;
  343. next if (/^$/ || /^\s*#/);
  344. /pos/i && loadVec(\%pos,$_);
  345. /color/i && loadCol(\%color,$_);
  346. /RGB/i && loadRGB(\%color,$_);
  347. /^\s*\}\s*$/ && last;
  348. }
  349. print OUT pack("C",$OBJId{'light_omni'});
  350. saveVec(%pos);
  351. saveRGB(%color);
  352. };
  353. sub loadAmbient {
  354. my(%color);
  355. print "Loading ambient\n";
  356. while (<IN>)
  357. {
  358. chomp;
  359. next if (/^$/ || /^\s*#/);
  360. /color/i && loadCol(\%color,$_);
  361. /RGB/i && loadRGB(\%color,$_);
  362. /^\s*\}\s*$/ && last;
  363. }
  364. print OUT pack("C",$OBJId{'ambient'});
  365. saveRGB(%color);
  366. };
  367. sub loadVec {
  368. my ($ph, $str) = @_;
  369. print "LoadVec: $str \n";
  370. $str =~ /\{\s*([-\d\.]+)\s+([-\d\.]+)\s+([-\d\.]+)\s*\}/i;
  371. $ph->{'X'} = $1;
  372. $ph->{'Y'} = $2;
  373. $ph->{'Z'} = $3;
  374. };
  375. sub loadCol {
  376. my ($ph,$str) = @_;
  377. print "LoadCol: $str \n";
  378. $str =~ /\{\s*([-\d\.]+)\s+([-\d\.]+)\s+([-\d\.]+)\s*\}/i;
  379. $ph->{'R'} = $1;
  380. $ph->{'G'} = $2;
  381. $ph->{'B'} = $3;
  382. };
  383. sub loadRGB {
  384. my($ph,$str) = @_;
  385. print "LoadRGB: $str \n";
  386. $str =~ /\{\s*([-\d\.]+)\s+([-\d\.]+)\s+([-\d\.]+)\s*\}/i;
  387. $ph->{'R'} = $1/255;
  388. $ph->{'G'} = $2/255;
  389. $ph->{'B'} = $3/255;
  390. };
  391. sub loadSurf {
  392. my($ph,$str) = @_;
  393. print "LoadSurf: $str \n";
  394. $str =~ /\{\s*([-\d\.]+)\s+([-\d\.]+)\s+([-\d\.]+)\s*\}/i;
  395. $ph->{'Kd'} = $1;
  396. $ph->{'Ks'} = $2;
  397. $ph->{'Ns'} = $3;
  398. };
  399. sub loadDouble {
  400. my($ph,$str) = @_;
  401. print "Loadval: $str \n";
  402. $str =~ /\{\s*([-\d\.]+)\s*\}/i;
  403. $$ph = $1;
  404. };
  405. sub saveVec {
  406. my (%vec) = @_;
  407. print OUT pack("d3",$vec{'X'},$vec{'Y'},$vec{'Z'});
  408. };
  409. sub saveRGB {
  410. my (%vec) = @_;
  411. print OUT pack("d3",$vec{'R'},$vec{'G'},$vec{'B'});
  412. };
  413. sub saveSurf {
  414. my (%vec) = @_;
  415. print OUT pack("d3",$vec{'Kd'},$vec{'Ks'},$vec{'Ns'});
  416. };
  417. sub saveDouble {
  418. my ($val) = @_;
  419. print OUT pack("d",$val);
  420. };