Advertisement
Guest User

Untitled

a guest
Mar 11th, 2021
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 112.68 KB | None | 0 0
  1. [CENTER]Worked on this over the past couple days, still working on it a bit.
  2.  
  3. Preview:
  4. [IMG]https://i.imgur.com/EgiQhj9.png[/IMG][IMG]https://i.imgur.com/5Yr3LvL.png[/IMG][IMG]https://i.imgur.com/1JwcRde.gif[/IMG]
  5.  
  6. Still missing a decent bit, haven't really touched textures, particles, etc. Will update as I go along. Hoping to get a full render by the time I'm done.
  7.  
  8. Lemme know if I forgot to copy/paste anything here.
  9. Not looking to make a full tutorial, just some references for anyone who needs.
  10.  
  11. Pass an rsmesh to the below javascript file in JSON format, should do the rest.
  12.  
  13. Code below should give an idea on how you can render individual items, head models, full body models, etc
  14.  
  15. [CODE]let renderer;
  16. let scene;
  17. let camera;
  18.  
  19. let cube;
  20.  
  21. let controls;
  22.  
  23. let animation;
  24. let rasterizer;
  25.  
  26. let renderId;
  27. let temporaryId = -1;
  28.  
  29. function loadScene(model) {
  30. console.log(model);
  31. scene = new THREE.Scene();
  32.  
  33. let width = 250;
  34. let height = 400;
  35.  
  36. camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 6000);
  37.  
  38. renderer = new THREE.WebGLRenderer();
  39. renderer.setSize(width, height);
  40.  
  41. $('#model-viewer').append(renderer.domElement);
  42.  
  43. //ADD CUBE
  44. let vertices = [];
  45.  
  46. let hasAlpha = model.FaceAlphas != null;
  47. let hasFaceTypes = model.FaceType != null;
  48.  
  49. //BUILD GEOMETRY
  50. for (let i = 0; i < model.FaceCount; i++) {
  51.  
  52. let alpha = hasAlpha ? model.FaceAlphas[i] : 0;
  53. if (alpha == -1) continue;
  54.  
  55. alpha = ~alpha & 0xFF;
  56. let faceType = hasFaceTypes ? model.FaceType[i] & 0x3 : 0;
  57.  
  58. let faceA, faceB, faceC;
  59. switch (faceType) {
  60. case 0:
  61. case 1:
  62. faceA = model.TriangleX[i];
  63. faceB = model.TriangleY[i];
  64. faceC = model.TriangleZ[i];
  65. break;
  66. case 2:
  67. case 3:
  68. faceA = model.TexTriX[i];
  69. faceB = model.TexTriY[i];
  70. faceC = model.TexTriZ[i];
  71. break;
  72. default:
  73. throw new Error('Unknown face type=' + faceType);
  74. }
  75.  
  76. let textureId = model.FaceTextures == null ? -1 : model.FaceTextures[i];
  77.  
  78. let u, v;
  79. let colour = model.RealFaceColour[i];
  80. let r = (colour >> 16) & 0xFF;
  81. let g = (colour >> 8) & 0xFF;
  82. let b = colour & 0xFF;
  83. vertices.push({ pos: [model.VertexX[faceA], model.VertexY[faceA], model.VertexZ[faceA]], norm: [faceA, faceB, faceC], colors: [r, g, b, alpha] });
  84. vertices.push({ pos: [model.VertexX[faceB], model.VertexY[faceB], model.VertexZ[faceB]], norm: [faceA, faceB, faceC], colors: [r, g, b, alpha] });
  85. vertices.push({ pos: [model.VertexX[faceC], model.VertexY[faceC], model.VertexZ[faceC]], norm: [faceA, faceB, faceC], colors: [r, g, b, alpha] });
  86. }
  87.  
  88. let positions = [];
  89. let normals = [];
  90. let colors = [];
  91. for (let vertex of vertices) {
  92. positions.push(...vertex.pos);
  93. normals.push(...vertex.norm);
  94. colors.push(...vertex.colors);
  95. }
  96.  
  97. let geometry = new THREE.BufferGeometry();
  98. geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(positions), 3));
  99. geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));
  100. geometry.addAttribute('color', new THREE.BufferAttribute(new Uint8Array(colors), 4, true));
  101.  
  102. geometry.normalizeNormals();
  103. geometry.computeVertexNormals();
  104.  
  105.  
  106. let material = new THREE.MeshBasicMaterial({ vertexColors: THREE.VertexColors });
  107. cube = new THREE.Mesh(geometry, material);
  108.  
  109. cube.rotation.x = Math.PI; //model renders upside down for some reason
  110.  
  111. scene.add(cube);
  112. camera.position.z = 3000;
  113.  
  114. controls = new THREE.TrackballControls(camera, renderer.domElement);
  115. controls.target.set(0, 500, 0);
  116.  
  117. controls.addEventListener('end', function() {
  118.  
  119. });
  120.  
  121. controls.noPan = true;
  122. controls.rotateSpeed = 0.03;
  123.  
  124. renderId = parseInt('!{animationId}');
  125.  
  126. rasterizer = new Rasterizer.Rasterizer(model, cube);
  127. animation = new Animation.Animation();
  128. animation.setupAnimation(renderId, model.Animation);
  129.  
  130. let playable = false;
  131.  
  132. animate();
  133.  
  134. setInterval(async function() {
  135. if (playable) return;
  136.  
  137. if (animation.setupLoop(1) && animation.getABool5462()) {
  138. if (temporaryId != -1) {
  139. animation.setupAnimation(renderId, model.Animation);
  140. temporaryId = -1;
  141. }
  142. animation.resetAnimation();
  143. }
  144. playable = true;
  145. if (animation != null)
  146. await animation.rasterize(rasterizer, 0);
  147. playable = false;
  148. }, 20);
  149. }
  150.  
  151. function animate() {
  152. requestAnimationFrame(animate);
  153.  
  154. controls.update();
  155.  
  156. renderer.render(scene, camera);
  157. }[/CODE]
  158.  
  159. [CODE] public static RSMesh renderPlayerHead(Account account) {
  160. try {
  161. int[] defaultLook = getDefaultLook();
  162. RSMesh[] meshes = new RSMesh[15];
  163. int size = 0;
  164. int[] equipped = account.getEquippedItems();
  165. if (equipped == null) {
  166. equipped = new int[15];
  167. Arrays.fill(equipped, -1);
  168. }
  169. if(equipped[EquipmentDefaults.HAT] != -1) {
  170. ItemDefinitions defs = ItemDefinitions.getItemDefinitions(equipped[EquipmentDefaults.HAT]);
  171. RSMesh mesh;
  172. if(defs != null && (mesh = defs.getHeadMesh(account.getGender() == 1, null)) != null)
  173. meshes[size++] = mesh;
  174. }
  175. for (int look : defaultLook) {
  176. if (look == -1) continue;
  177. IdentiKitDefinition defs = IdentiKitDefinition.getIdentikitDefinition(look);
  178. RSMesh mesh;
  179. if (defs == null || (mesh = defs.renderHead(size > 0)) == null) continue;
  180. meshes[size++] = mesh;
  181. }
  182. return new RSMesh(meshes, size);
  183. } catch(Exception e) {
  184. e.printStackTrace();
  185. return null;
  186. }
  187. }
  188.  
  189. public static RSMesh renderPlayerBody(Account account) {
  190. try {
  191. int[] look = getDefaultLook();
  192. LinkedTreeMap<String, Object>[] equipped = account.getEquippedItems();
  193. if (equipped == null)
  194. equipped = new LinkedTreeMap[15];
  195. RSMesh[] meshes = new RSMesh[15];
  196. int size = 0;
  197. for(int i = 0; i < 4; i++) {
  198. if(equipped[i] == null) continue;
  199. int id = (int) ((double) equipped[i].get("id"));
  200. if(id == -1) continue;
  201. MeshModifier modifier = null;
  202. if(equipped[i].containsKey("colours")) {
  203. short[] colours = new short[4];
  204. ArrayList<Double> iColours = (ArrayList<Double>) equipped[i].get("colours");
  205. int index = 0;
  206. for(Double col : iColours)
  207. colours[index++] = col.shortValue();
  208. modifier = new MeshModifier(colours, null);
  209. }
  210. ItemDefinitions defs = ItemDefinitions.getItemDefinitions(id);
  211. RSMesh mesh;
  212. if (defs == null || (mesh = defs.getBodyMesh(account.getGender() == 1, modifier)) == null) continue;
  213. meshes[size++] = mesh;
  214. }
  215. //chest
  216. RSMesh mesh;
  217. int id = (int) ((double) equipped[EquipmentDefaults.CHEST].get("id"));
  218. if(id == -1)
  219. mesh = renderLook(2);
  220. else
  221. mesh = renderItem(account, id, null);
  222. if(mesh != null)
  223. meshes[size++] = mesh;
  224.  
  225. id = (int) ((double) equipped[EquipmentDefaults.SHIELD].get("id"));
  226. if(id != -1)
  227. meshes[size++] = renderItem(account, id, null);
  228.  
  229. id = (int) ((double) equipped[EquipmentDefaults.CHEST].get("id"));
  230. mesh = null;
  231. if(look[3] == -1 && (id == -1 || !EquipmentDefaults.hideArms(id)))
  232. mesh = renderLook(3);
  233. else if(id != -1 && !EquipmentDefaults.hideArms(id))
  234. mesh = renderIdentikit(account.getGender() == 0 ? 26 : 61);
  235. if(mesh != null)
  236. meshes[size++] = mesh;
  237.  
  238. id = (int) ((double) equipped[EquipmentDefaults.LEGS].get("id"));
  239. if(id == -1)
  240. mesh = renderLook(5);
  241. else
  242. mesh = renderItem(account, id, null);
  243. if(mesh != null)
  244. meshes[size++] = mesh;
  245.  
  246. id = (int) ((double) equipped[EquipmentDefaults.HAT].get("id"));
  247. mesh = null;
  248. if(look[0] != -1 && (id == -1 || !EquipmentDefaults.hideHair(id))) {
  249. if(id == -1)
  250. mesh = renderLook(0);
  251. else {
  252. ItemDefinitions defs = ItemDefinitions.getItemDefinitions(id);
  253. if(defs != null) {
  254. int style = EquipmentDefaults.getHatHairStyle(getDefaultLook()[0], defs.faceMask(), account.getGender() == 1);
  255. if (style != -1)
  256. mesh = renderIdentikit(style);
  257. }
  258. }
  259. }
  260. if(mesh != null)
  261. meshes[size++] = mesh;
  262.  
  263. id = (int) ((double) equipped[EquipmentDefaults.HANDS].get("id"));
  264. if(id == -1)
  265. mesh = renderLook(4);
  266. else
  267. mesh = renderItem(account, id, null);
  268. meshes[size++] = mesh;
  269.  
  270. id = (int) ((double) equipped[EquipmentDefaults.FEET].get("id"));
  271. if(id == -1)
  272. mesh = renderLook(6);
  273. else
  274. mesh = renderItem(account, id, null);
  275. meshes[size++] = mesh;
  276.  
  277. boolean male = account.getGender() == 0;
  278. int slot = male ? EquipmentDefaults.HAT : EquipmentDefaults.CHEST;
  279. id = (int) ((double) equipped[slot].get("id"));
  280. if(male && look[1] != -1 && (id == -1 || (male && !EquipmentDefaults.hideBeard(id))))
  281. meshes[size++] = renderLook(1);
  282.  
  283. return new RSMesh(meshes, size);
  284. } catch(Exception e) {
  285. e.printStackTrace();
  286. }
  287. return null;
  288. }
  289.  
  290. public static RSMesh renderLook(int look) {
  291. int id = getDefaultLook()[look];
  292. if(id == -1) return null;
  293. return renderIdentikit(id);
  294. }
  295.  
  296. public static RSMesh renderIdentikit(int id) {
  297. IdentiKitDefinition defs = IdentiKitDefinition.getIdentikitDefinition(id);
  298. if(defs == null) return null;
  299. return defs.renderBody();
  300. }
  301.  
  302. public static RSMesh renderItem(Account account, int id, MeshModifier modifier) {
  303. ItemDefinitions defs = ItemDefinitions.getItemDefinitions(id);
  304. if(defs == null) return null;
  305. return defs.getBodyMesh(account.getGender() == 1, modifier);
  306. }[/CODE]
  307.  
  308. [CODE]package com.cryo.cache.loaders.model;
  309.  
  310. import com.cryo.cache.io.InputStream;
  311. import com.cryo.utils.Utilities;
  312.  
  313. public class RSMesh {
  314.  
  315. private int id;
  316. public int version = 12;
  317. public int vertexCount;
  318. public int maxDepth;
  319. public int faceCount;
  320. public byte priority;
  321. public int texturedFaceCount;
  322. public int[] textureRenderTypes;
  323. public int[] vertexX;
  324. public int[] vertexY;
  325. public int[] vertexZ;
  326. public short[] triangleX;
  327. public short[] triangleY;
  328. public short[] triangleZ;
  329. public int[] vertexSkins;
  330. public byte[] faceType;
  331. public byte[] facePriorities;
  332. public byte[] faceAlphas;
  333. public int[] textureSkins;
  334. public short[] faceTextures;
  335. public short[] faceColor;
  336. public int[] realFaceColour;
  337. public byte[] texturePos;
  338. public short[] texTriX;
  339. public short[] texTriY;
  340. public short[] texTriZ;
  341. public int[] particleDirectionX;
  342. public int[] particleDirectionY;
  343. public int[] particleDirectionZ;
  344. public int[] particleLifespanX;
  345. public int[] particleLifespanY;
  346. public int[] particleLifespanZ;
  347. public int[] texturePrimaryColor;
  348. public int[] textureSecondaryColor;
  349. public short[] aShortArray1980;
  350. public short[] aShortArray1981;
  351.  
  352. private ParticleEmitterConfig[] particleConfig;
  353. private SurfaceSkin[] surfaceSkins;
  354. private VertexNormal[] isolatedVertexNormals;
  355.  
  356. public RSMesh() {
  357. vertexCount = 0;
  358. faceCount = 0;
  359. texturedFaceCount = 0;
  360. int i_3 = 0;
  361. int i_4 = 0;
  362. int i_5 = 0;
  363. boolean bool_6 = false;
  364. boolean bool_7 = false;
  365. boolean bool_8 = false;
  366. boolean bool_9 = false;
  367. boolean bool_10 = false;
  368. boolean bool_11 = false;
  369. priority = -1;
  370. }
  371.  
  372. public void decode(byte[] data) {
  373. if (data[data.length - 1] == -1 && data[data.length - 2] == -1) {
  374. decodeNewFormat(data);
  375. } else {
  376. decodeOldFormat(data);
  377. }
  378. }
  379.  
  380. public void decodeNewFormat(byte[] data) {
  381. InputStream first = new InputStream(data);
  382. InputStream second = new InputStream(data);
  383. InputStream third = new InputStream(data);
  384. InputStream fourth = new InputStream(data);
  385. InputStream fifth = new InputStream(data);
  386. InputStream sixth = new InputStream(data);
  387. InputStream seventh = new InputStream(data);
  388. first.setOffset(data.length - 23);
  389. vertexCount = first.readUnsignedShort();
  390. faceCount = first.readUnsignedShort();
  391. texturedFaceCount = first.readUnsignedByte();
  392. int i_9 = first.readUnsignedByte();
  393. boolean hasFaceRenderTypes = (i_9 & 0x1) == 1;
  394. boolean hasParticleEffects = (i_9 & 0x2) == 2;
  395. boolean hasBillboards = (i_9 & 0x4) == 4;
  396. boolean hasVersion = (i_9 & 0x8) == 8;
  397. if (hasVersion) {
  398. first.setOffset(first.getOffset() - 7);
  399. version = first.readUnsignedByte();
  400. first.setOffset(first.getOffset() + 6);
  401. }
  402.  
  403. int modelPriority = first.readUnsignedByte();
  404. int hasFaceAlpha = first.readUnsignedByte();
  405. int hasFaceSkins = first.readUnsignedByte();
  406. int hasFaceTextures = first.readUnsignedByte();
  407. int hasVertexSkins = first.readUnsignedByte();
  408. int modelVerticesX = first.readUnsignedShort();
  409. int modelVerticesY = first.readUnsignedShort();
  410. int modelVerticesZ = first.readUnsignedShort();
  411. int faceIndices = first.readUnsignedShort();
  412. int textureIndices = first.readUnsignedShort();
  413. if(id == 60060)
  414. System.out.println("face: "+faceIndices+" tex: "+textureIndices);
  415. int numVertexSkins = 0;
  416. int i_25 = 0;
  417. int i_26 = 0;
  418. if (texturedFaceCount > 0) {
  419. textureRenderTypes = new int[texturedFaceCount];
  420. first.setOffset(0);
  421.  
  422. for (int i = 0; i < texturedFaceCount; i++) {
  423. int b_28 = textureRenderTypes[i] = first.readByte();
  424. if (b_28 == 0) {
  425. ++numVertexSkins;
  426. }
  427.  
  428. if (b_28 >= 1 && b_28 <= 3) {
  429. ++i_25;
  430. }
  431.  
  432. if (b_28 == 2) {
  433. ++i_26;
  434. }
  435. }
  436. }
  437.  
  438. int totalFaces = texturedFaceCount;
  439. int flagBufferOffset = totalFaces;
  440. totalFaces += vertexCount;
  441. int i_29 = totalFaces;
  442. if (hasFaceRenderTypes) {
  443. totalFaces += faceCount;
  444. }
  445.  
  446. int i_30 = totalFaces;
  447. totalFaces += faceCount;
  448. int i_31 = totalFaces;
  449. if (modelPriority == 255) {
  450. totalFaces += faceCount;
  451. }
  452.  
  453. int i_32 = totalFaces;
  454. if (hasFaceSkins == 1) {
  455. totalFaces += faceCount;
  456. }
  457.  
  458. int vertSkinsBufferOffset = totalFaces;
  459. if (hasVertexSkins == 1) {
  460. totalFaces += vertexCount;
  461. }
  462.  
  463. int i_34 = totalFaces;
  464. if (hasFaceAlpha == 1) {
  465. totalFaces += faceCount;
  466. }
  467.  
  468. int i_35 = totalFaces;
  469. totalFaces += faceIndices;
  470. int i_36 = totalFaces;
  471. if (hasFaceTextures == 1) {
  472. totalFaces += faceCount * 2;
  473. }
  474.  
  475. int i_37 = totalFaces;
  476. totalFaces += textureIndices;
  477. int i_38 = totalFaces;
  478. totalFaces += faceCount * 2;
  479. int vertXBufferOffset = totalFaces;
  480. totalFaces += modelVerticesX;
  481. int vertYBufferOffset = totalFaces;
  482. totalFaces += modelVerticesY;
  483. int vertZBufferOffset = totalFaces;
  484. totalFaces += modelVerticesZ;
  485. int simple_tex_pmn_offset = totalFaces;
  486. totalFaces += numVertexSkins * 6;
  487. int i_43 = totalFaces;
  488. totalFaces += i_25 * 6;
  489. byte b_44 = 6;
  490. if (version == 14) {
  491. b_44 = 7;
  492. } else if (version >= 15) {
  493. b_44 = 9;
  494. }
  495.  
  496. int i_45 = totalFaces;
  497. totalFaces += i_25 * b_44;
  498. int i_46 = totalFaces;
  499. totalFaces += i_25;
  500. int i_47 = totalFaces;
  501. totalFaces += i_25;
  502. int i_48 = totalFaces;
  503. totalFaces = i_26 * 2 + totalFaces + i_25;
  504. vertexX = new int[vertexCount];
  505. vertexY = new int[vertexCount];
  506. vertexZ = new int[vertexCount];
  507. triangleX = new short[faceCount];
  508. triangleY = new short[faceCount];
  509. triangleZ = new short[faceCount];
  510. if (hasVertexSkins == 1) {
  511. vertexSkins = new int[vertexCount];
  512. }
  513.  
  514. if (hasFaceRenderTypes) {
  515. faceType = new byte[faceCount];
  516. }
  517.  
  518. if (modelPriority == 255) {
  519. facePriorities = new byte[faceCount];
  520. } else {
  521. priority = (byte) modelPriority;
  522. }
  523.  
  524. if (hasFaceAlpha == 1) {
  525. faceAlphas = new byte[faceCount];
  526. }
  527.  
  528. if (hasFaceSkins == 1) {
  529. textureSkins = new int[faceCount];
  530. }
  531.  
  532. if (hasFaceTextures == 1) {
  533. faceTextures = new short[faceCount];
  534. }
  535.  
  536. if (hasFaceTextures == 1 && texturedFaceCount > 0) {
  537. texturePos = new byte[faceCount];
  538. }
  539.  
  540. faceColor = new short[faceCount];
  541. if (texturedFaceCount > 0) {
  542. texTriX = new short[texturedFaceCount];
  543. texTriY = new short[texturedFaceCount];
  544. texTriZ = new short[texturedFaceCount];
  545. if (i_25 > 0) {
  546. particleDirectionX = new int[i_25];
  547. particleDirectionY = new int[i_25];
  548. particleDirectionZ = new int[i_25];
  549. particleLifespanX = new int[i_25];
  550. particleLifespanY = new int[i_25];
  551. particleLifespanZ = new int[i_25];
  552. }
  553.  
  554. if (i_26 > 0) {
  555. texturePrimaryColor = new int[i_26];
  556. textureSecondaryColor = new int[i_26];
  557. }
  558. }
  559.  
  560.  
  561. first.setOffset(flagBufferOffset);
  562. second.setOffset(vertXBufferOffset);
  563. third.setOffset(vertYBufferOffset);
  564. fourth.setOffset(vertZBufferOffset);
  565. fifth.setOffset(vertSkinsBufferOffset);
  566. int baseX = 0;
  567. int baseY = 0;
  568. int baseZ = 0;
  569.  
  570. for (int vertex = 0; vertex < vertexCount; vertex++) {
  571. int offsetFlags = first.readUnsignedByte();
  572. int vertextOffsetX = 0;
  573. if ((offsetFlags & 0x1) != 0) {
  574. vertextOffsetX = second.readUnsignedSmart2();
  575. }
  576.  
  577. int vertextOffsetY = 0;
  578. if ((offsetFlags & 0x2) != 0) {
  579. vertextOffsetY = third.readUnsignedSmart2();
  580. }
  581.  
  582. int vertetxOffsetZ = 0;
  583. if ((offsetFlags & 0x4) != 0) {
  584. vertetxOffsetZ = fourth.readUnsignedSmart2();
  585. }
  586.  
  587. vertexX[vertex] = baseX + vertextOffsetX;
  588. vertexY[vertex] = baseY + vertextOffsetY;
  589. vertexZ[vertex] = baseZ + vertetxOffsetZ;
  590. baseX = vertexX[vertex];
  591. baseY = vertexY[vertex];
  592. baseZ = vertexZ[vertex];
  593. if (hasVertexSkins == 1) {
  594. vertexSkins[vertex] = fifth.readUnsignedByte();
  595. }
  596. }
  597.  
  598. first.setOffset(i_38);
  599. second.setOffset(i_29);
  600. third.setOffset(i_31);
  601. fourth.setOffset(i_34);
  602. fifth.setOffset(i_32);
  603. sixth.setOffset(i_36);
  604. seventh.setOffset(i_37);
  605.  
  606. for (int i_53 = 0; i_53 < faceCount; i_53++) {
  607. faceColor[i_53] = (short) first.readUnsignedShort();
  608. if (hasFaceRenderTypes) {
  609. faceType[i_53] = (byte) second.readByte();
  610. }
  611.  
  612. if (modelPriority == 255) {
  613. facePriorities[i_53] = (byte) third.readByte();
  614. }
  615.  
  616. if (hasFaceAlpha == 1) {
  617. faceAlphas[i_53] = (byte) fourth.readByte();
  618. }
  619.  
  620. if (hasFaceSkins == 1) {
  621. textureSkins[i_53] = fifth.readUnsignedByte();
  622. }
  623.  
  624. if (hasFaceTextures == 1) {
  625. faceTextures[i_53] = (short) (sixth.readUnsignedShort() - 1);
  626. }
  627.  
  628. if (texturePos != null) {
  629. if (faceTextures[i_53] != -1) {
  630. texturePos[i_53] = (byte) (seventh.readUnsignedByte() - 1);
  631. } else {
  632. texturePos[i_53] = -1;
  633. }
  634. }
  635. }
  636.  
  637. maxDepth = -1;
  638. first.setOffset(i_35);
  639. second.setOffset(i_30);
  640. calculateMaxDepth(first, second);
  641. first.setOffset(simple_tex_pmn_offset);
  642. second.setOffset(i_43);
  643. third.setOffset(i_45);
  644. fourth.setOffset(i_46);
  645. fifth.setOffset(i_47);
  646. sixth.setOffset(i_48);
  647. decodeTexturedTriangles(first, second, third, fourth, fifth, sixth);
  648. first.setOffset(totalFaces);
  649. if (hasParticleEffects) {
  650. int emitterCount = first.readUnsignedByte();
  651. if (emitterCount > 0) {
  652. particleConfig = new ParticleEmitterConfig[emitterCount];
  653.  
  654. for (int i = 0; i < emitterCount; i++) {
  655. int particleId = first.readUnsignedShort();
  656. int faceIdx = first.readUnsignedShort();
  657. byte b_60;
  658. if (modelPriority == 255) {
  659. b_60 = facePriorities[faceIdx];
  660. } else {
  661. b_60 = (byte) modelPriority;
  662. }
  663.  
  664. particleConfig[i] = new ParticleEmitterConfig(particleId, triangleX[faceIdx], triangleY[faceIdx], triangleZ[faceIdx], b_60);
  665. }
  666. }
  667.  
  668. int surfaceSkinCount = first.readUnsignedByte();
  669. if (surfaceSkinCount > 0) {
  670. surfaceSkins = new SurfaceSkin[surfaceSkinCount];
  671.  
  672. for (int i = 0; i < surfaceSkinCount; i++) {
  673. int x = first.readUnsignedShort();
  674. int y = first.readUnsignedShort();
  675. surfaceSkins[i] = new SurfaceSkin(x, y);
  676. }
  677. }
  678. }
  679.  
  680. if (hasBillboards) {
  681. int i_53 = first.readUnsignedByte();
  682. if (i_53 > 0) {
  683. isolatedVertexNormals = new VertexNormal[i_53];
  684.  
  685. for (int i = 0; i < i_53; i++) {
  686. int vertextOffsetX = first.readUnsignedShort();
  687. int vertextOffsetY = first.readUnsignedShort();
  688. int vertetxOffsetZ = first.readUnsignedByte();
  689. byte b_58 = (byte) first.readByte();
  690. isolatedVertexNormals[i] = new VertexNormal(vertextOffsetX, vertextOffsetY, vertetxOffsetZ, b_58);
  691. }
  692. }
  693. }
  694. }
  695.  
  696. public void decodeOldFormat(byte[] data) {
  697. boolean bool_2 = false;
  698. boolean bool_3 = false;
  699. InputStream first = new InputStream(data);
  700. InputStream second = new InputStream(data);
  701. InputStream third = new InputStream(data);
  702. InputStream fourth = new InputStream(data);
  703. InputStream firth = new InputStream(data);
  704. first.setOffset(data.length - 18);
  705. vertexCount = first.readUnsignedShort();
  706. faceCount = first.readUnsignedShort();
  707. texturedFaceCount = first.readUnsignedByte();
  708. int i_9 = first.readUnsignedByte();
  709. int i_10 = first.readUnsignedByte();
  710. int i_11 = first.readUnsignedByte();
  711. int i_12 = first.readUnsignedByte();
  712. int i_13 = first.readUnsignedByte();
  713. int i_14 = first.readUnsignedShort();
  714. int i_15 = first.readUnsignedShort();
  715. int i_16 = first.readUnsignedShort();
  716. int i_17 = first.readUnsignedShort();
  717. byte b_18 = 0;
  718. int i_42 = b_18 + vertexCount;
  719. int i_20 = i_42;
  720. i_42 += faceCount;
  721. int i_21 = i_42;
  722. if (i_10 == 255) {
  723. i_42 += faceCount;
  724. }
  725.  
  726. int i_22 = i_42;
  727. if (i_12 == 1) {
  728. i_42 += faceCount;
  729. }
  730.  
  731. int i_23 = i_42;
  732. if (i_9 == 1) {
  733. i_42 += faceCount;
  734. }
  735.  
  736. int i_24 = i_42;
  737. if (i_13 == 1) {
  738. i_42 += vertexCount;
  739. }
  740.  
  741. int i_25 = i_42;
  742. if (i_11 == 1) {
  743. i_42 += faceCount;
  744. }
  745.  
  746. int i_26 = i_42;
  747. i_42 += i_17;
  748. int i_27 = i_42;
  749. i_42 += faceCount * 2;
  750. int i_28 = i_42;
  751. i_42 += texturedFaceCount * 6;
  752. int i_29 = i_42;
  753. i_42 += i_14;
  754. int i_30 = i_42;
  755. i_42 += i_15;
  756. int i_10000 = i_42 + i_16;
  757. vertexX = new int[vertexCount];
  758. vertexY = new int[vertexCount];
  759. vertexZ = new int[vertexCount];
  760. triangleX = new short[faceCount];
  761. triangleY = new short[faceCount];
  762. triangleZ = new short[faceCount];
  763. if (texturedFaceCount > 0) {
  764. textureRenderTypes = new int[texturedFaceCount];
  765. texTriX = new short[texturedFaceCount];
  766. texTriY = new short[texturedFaceCount];
  767. texTriZ = new short[texturedFaceCount];
  768. }
  769.  
  770. if (i_13 == 1) {
  771. vertexSkins = new int[vertexCount];
  772. }
  773.  
  774. if (i_9 == 1) {
  775. faceType = new byte[faceCount];
  776. texturePos = new byte[faceCount];
  777. faceTextures = new short[faceCount];
  778. }
  779.  
  780. if (i_10 == 255) {
  781. facePriorities = new byte[faceCount];
  782. } else {
  783. priority = (byte) i_10;
  784. }
  785.  
  786. if (i_11 == 1) {
  787. faceAlphas = new byte[faceCount];
  788. }
  789.  
  790. if (i_12 == 1) {
  791. textureSkins = new int[faceCount];
  792. }
  793.  
  794. faceColor = new short[faceCount];
  795. first.setOffset(b_18);
  796. second.setOffset(i_29);
  797. third.setOffset(i_30);
  798. fourth.setOffset(i_42);
  799. firth.setOffset(i_24);
  800. int i_32 = 0;
  801. int i_33 = 0;
  802. int i_34 = 0;
  803.  
  804. int i_35;
  805. int i_36;
  806. int i_39;
  807. for (i_35 = 0; i_35 < vertexCount; i_35++) {
  808. i_36 = first.readUnsignedByte();
  809. int i_37 = 0;
  810. if ((i_36 & 0x1) != 0) {
  811. i_37 = second.readUnsignedSmart2();
  812. }
  813.  
  814. int i_38 = 0;
  815. if ((i_36 & 0x2) != 0) {
  816. i_38 = third.readUnsignedSmart2();
  817. }
  818.  
  819. i_39 = 0;
  820. if ((i_36 & 0x4) != 0) {
  821. i_39 = fourth.readUnsignedSmart2();
  822. }
  823.  
  824. vertexX[i_35] = i_32 + i_37;
  825. vertexY[i_35] = i_33 + i_38;
  826. vertexZ[i_35] = i_34 + i_39;
  827. i_32 = vertexX[i_35];
  828. i_33 = vertexY[i_35];
  829. i_34 = vertexZ[i_35];
  830. if (i_13 == 1) {
  831. vertexSkins[i_35] = firth.readUnsignedByte();
  832. }
  833. }
  834.  
  835. first.setOffset(i_27);
  836. second.setOffset(i_23);
  837. third.setOffset(i_21);
  838. fourth.setOffset(i_25);
  839. firth.setOffset(i_22);
  840.  
  841. for (i_35 = 0; i_35 < faceCount; i_35++) {
  842. faceColor[i_35] = (short) first.readUnsignedShort();
  843. if (i_9 == 1) {
  844. i_36 = second.readUnsignedByte();
  845. if ((i_36 & 0x1) == 1) {
  846. faceType[i_35] = 1;
  847. bool_2 = true;
  848. } else {
  849. faceType[i_35] = 0;
  850. }
  851.  
  852. if ((i_36 & 0x2) == 2) {
  853. texturePos[i_35] = (byte) (i_36 >> 2);
  854. faceTextures[i_35] = faceColor[i_35];
  855. faceColor[i_35] = 127;
  856. if (faceTextures[i_35] != -1) {
  857. bool_3 = true;
  858. }
  859. } else {
  860. texturePos[i_35] = -1;
  861. faceTextures[i_35] = -1;
  862. }
  863. }
  864.  
  865. if (i_10 == 255) {
  866. facePriorities[i_35] = (byte) third.readByte();
  867. }
  868.  
  869. if (i_11 == 1) {
  870. faceAlphas[i_35] = (byte) fourth.readByte();
  871. }
  872.  
  873. if (i_12 == 1) {
  874. textureSkins[i_35] = firth.readUnsignedByte();
  875. }
  876. }
  877.  
  878. maxDepth = -1;
  879. first.setOffset(i_26);
  880. second.setOffset(i_20);
  881. short s_43 = 0;
  882. short s_44 = 0;
  883. short s_45 = 0;
  884. short s_46 = 0;
  885.  
  886. int i_40;
  887. for (i_39 = 0; i_39 < faceCount; i_39++) {
  888. i_40 = second.readUnsignedByte();
  889. if (i_40 == 1) {
  890. s_43 = (short) (first.readUnsignedSmart2() + s_46);
  891. s_44 = (short) (first.readUnsignedSmart2() + s_43);
  892. s_45 = (short) (first.readUnsignedSmart2() + s_44);
  893. s_46 = s_45;
  894. triangleX[i_39] = s_43;
  895. triangleY[i_39] = s_44;
  896. triangleZ[i_39] = s_45;
  897. if (s_43 > maxDepth) {
  898. maxDepth = s_43;
  899. }
  900.  
  901. if (s_44 > maxDepth) {
  902. maxDepth = s_44;
  903. }
  904.  
  905. if (s_45 > maxDepth) {
  906. maxDepth = s_45;
  907. }
  908. }
  909.  
  910. if (i_40 == 2) {
  911. s_44 = s_45;
  912. s_45 = (short) (first.readUnsignedSmart2() + s_46);
  913. s_46 = s_45;
  914. triangleX[i_39] = s_43;
  915. triangleY[i_39] = s_44;
  916. triangleZ[i_39] = s_45;
  917. if (s_45 > maxDepth) {
  918. maxDepth = s_45;
  919. }
  920. }
  921.  
  922. if (i_40 == 3) {
  923. s_43 = s_45;
  924. s_45 = (short) (first.readUnsignedSmart2() + s_46);
  925. s_46 = s_45;
  926. triangleX[i_39] = s_43;
  927. triangleY[i_39] = s_44;
  928. triangleZ[i_39] = s_45;
  929. if (s_45 > maxDepth) {
  930. maxDepth = s_45;
  931. }
  932. }
  933.  
  934. if (i_40 == 4) {
  935. short s_41 = s_43;
  936. s_43 = s_44;
  937. s_44 = s_41;
  938. s_45 = (short) (first.readUnsignedSmart2() + s_46);
  939. s_46 = s_45;
  940. triangleX[i_39] = s_43;
  941. triangleY[i_39] = s_41;
  942. triangleZ[i_39] = s_45;
  943. if (s_45 > maxDepth) {
  944. maxDepth = s_45;
  945. }
  946. }
  947. }
  948.  
  949. ++maxDepth;
  950. first.setOffset(i_28);
  951.  
  952. for (i_39 = 0; i_39 < texturedFaceCount; i_39++) {
  953. textureRenderTypes[i_39] = 0;
  954. texTriX[i_39] = (short) first.readUnsignedShort();
  955. texTriY[i_39] = (short) first.readUnsignedShort();
  956. texTriZ[i_39] = (short) first.readUnsignedShort();
  957. }
  958.  
  959. if (texturePos != null) {
  960. boolean bool_47 = false;
  961.  
  962. for (i_40 = 0; i_40 < faceCount; i_40++) {
  963. int i_48 = texturePos[i_40] & 0xff;
  964. if (i_48 != 255) {
  965. if (triangleX[i_40] == (texTriX[i_48] & 0xffff) && triangleY[i_40] == (texTriY[i_48] & 0xffff) && triangleZ[i_40] == (texTriZ[i_48] & 0xffff)) {
  966. texturePos[i_40] = -1;
  967. } else {
  968. bool_47 = true;
  969. }
  970. }
  971. }
  972.  
  973. if (!bool_47) {
  974. texturePos = null;
  975. }
  976. }
  977.  
  978. if (!bool_3) {
  979. faceTextures = null;
  980. }
  981.  
  982. if (!bool_2) {
  983. faceType = null;
  984. }
  985. }
  986.  
  987. public void setRealColours() {
  988. short[] colours = this.faceColor;
  989. int[] realColours = new int[colours.length];
  990. for(int i = 0; i < colours.length; i++) {
  991. int colour = Utilities.hslToRgb(colours[i] & 0xffff);
  992. realColours[i] = colour;
  993. int r = (colour>>16)&0xFF;
  994. int g = (colour>>8)&0xFF;
  995. int b = (colour>>0)&0xFF;
  996. }
  997. this.realFaceColour = realColours;
  998. }
  999. void calculateMaxDepth(InputStream first, InputStream second) {
  1000. short s_3 = 0;
  1001. short s_4 = 0;
  1002. short s_5 = 0;
  1003. short s_6 = 0;
  1004.  
  1005. for (int i_7 = 0; i_7 < faceCount; i_7++) {
  1006. int i_8 = second.readUnsignedByte();
  1007. if (i_8 == 1) {
  1008. s_3 = (short) (first.readUnsignedSmart2() + s_6);
  1009. s_4 = (short) (first.readUnsignedSmart2() + s_3);
  1010. s_5 = (short) (first.readUnsignedSmart2() + s_4);
  1011. s_6 = s_5;
  1012. triangleX[i_7] = s_3;
  1013. triangleY[i_7] = s_4;
  1014. triangleZ[i_7] = s_5;
  1015. if (s_3 > maxDepth) {
  1016. maxDepth = s_3;
  1017. }
  1018.  
  1019. if (s_4 > maxDepth) {
  1020. maxDepth = s_4;
  1021. }
  1022.  
  1023. if (s_5 > maxDepth) {
  1024. maxDepth = s_5;
  1025. }
  1026. }
  1027.  
  1028. if (i_8 == 2) {
  1029. s_4 = s_5;
  1030. s_5 = (short) (first.readUnsignedSmart2() + s_6);
  1031. s_6 = s_5;
  1032. triangleX[i_7] = s_3;
  1033. triangleY[i_7] = s_4;
  1034. triangleZ[i_7] = s_5;
  1035. if (s_5 > maxDepth) {
  1036. maxDepth = s_5;
  1037. }
  1038. }
  1039.  
  1040. if (i_8 == 3) {
  1041. s_3 = s_5;
  1042. s_5 = (short) (first.readUnsignedSmart2() + s_6);
  1043. s_6 = s_5;
  1044. triangleX[i_7] = s_3;
  1045. triangleY[i_7] = s_4;
  1046. triangleZ[i_7] = s_5;
  1047. if (s_5 > maxDepth) {
  1048. maxDepth = s_5;
  1049. }
  1050. }
  1051.  
  1052. if (i_8 == 4) {
  1053. short s_9 = s_3;
  1054. s_3 = s_4;
  1055. s_4 = s_9;
  1056. s_5 = (short) (first.readUnsignedSmart2() + s_6);
  1057. s_6 = s_5;
  1058. triangleX[i_7] = s_3;
  1059. triangleY[i_7] = s_9;
  1060. triangleZ[i_7] = s_5;
  1061. if (s_5 > maxDepth) {
  1062. maxDepth = s_5;
  1063. }
  1064. }
  1065. }
  1066.  
  1067. ++maxDepth;
  1068. }
  1069.  
  1070. void decodeTexturedTriangles(InputStream first, InputStream second, InputStream third, InputStream fourth, InputStream fifth, InputStream sixth) {
  1071. for (int i_7 = 0; i_7 < texturedFaceCount; i_7++) {
  1072. int i_8 = textureRenderTypes[i_7] & 0xff;
  1073. if (i_8 == 0) {
  1074. texTriX[i_7] = (short) first.readUnsignedShort();
  1075. texTriY[i_7] = (short) first.readUnsignedShort();
  1076. texTriZ[i_7] = (short) first.readUnsignedShort();
  1077. }
  1078.  
  1079. if (i_8 == 1) {
  1080. texTriX[i_7] = (short) second.readUnsignedShort();
  1081. texTriY[i_7] = (short) second.readUnsignedShort();
  1082. texTriZ[i_7] = (short) second.readUnsignedShort();
  1083. if (version < 15) {
  1084. particleDirectionX[i_7] = third.readUnsignedShort();
  1085. if (version < 14) {
  1086. particleDirectionY[i_7] = third.readUnsignedShort();
  1087. } else {
  1088. particleDirectionY[i_7] = third.read24BitUnsignedInt();
  1089. }
  1090.  
  1091. particleDirectionZ[i_7] = third.readUnsignedShort();
  1092. } else {
  1093. particleDirectionX[i_7] = third.read24BitUnsignedInt();
  1094. particleDirectionY[i_7] = third.read24BitUnsignedInt();
  1095. particleDirectionZ[i_7] = third.read24BitUnsignedInt();
  1096. }
  1097.  
  1098. particleLifespanX[i_7] = fourth.readByte();
  1099. particleLifespanY[i_7] = fifth.readByte();
  1100. particleLifespanZ[i_7] = sixth.readByte();
  1101. }
  1102.  
  1103. if (i_8 == 2) {
  1104. texTriX[i_7] = (short) second.readUnsignedShort();
  1105. texTriY[i_7] = (short) second.readUnsignedShort();
  1106. texTriZ[i_7] = (short) second.readUnsignedShort();
  1107. if (version < 15) {
  1108. particleDirectionX[i_7] = third.readUnsignedShort();
  1109. if (version < 14) {
  1110. particleDirectionY[i_7] = third.readUnsignedShort();
  1111. } else {
  1112. particleDirectionY[i_7] = third.read24BitUnsignedInt();
  1113. }
  1114.  
  1115. particleDirectionZ[i_7] = third.readUnsignedShort();
  1116. } else {
  1117. particleDirectionX[i_7] = third.read24BitUnsignedInt();
  1118. particleDirectionY[i_7] = third.read24BitUnsignedInt();
  1119. particleDirectionZ[i_7] = third.read24BitUnsignedInt();
  1120. }
  1121.  
  1122. particleLifespanX[i_7] = fourth.readByte();
  1123. particleLifespanY[i_7] = fifth.readByte();
  1124. particleLifespanZ[i_7] = sixth.readByte();
  1125. texturePrimaryColor[i_7] = sixth.readByte();
  1126. textureSecondaryColor[i_7] = sixth.readByte();
  1127. }
  1128.  
  1129. if (i_8 == 3) {
  1130. texTriX[i_7] = (short) second.readUnsignedShort();
  1131. texTriY[i_7] = (short) second.readUnsignedShort();
  1132. texTriZ[i_7] = (short) second.readUnsignedShort();
  1133. if (version < 15) {
  1134. particleDirectionX[i_7] = third.readUnsignedShort();
  1135. if (version < 14) {
  1136. particleDirectionY[i_7] = third.readUnsignedShort();
  1137. } else {
  1138. particleDirectionY[i_7] = third.read24BitUnsignedInt();
  1139. }
  1140.  
  1141. particleDirectionZ[i_7] = third.readUnsignedShort();
  1142. } else {
  1143. particleDirectionX[i_7] = third.read24BitUnsignedInt();
  1144. particleDirectionY[i_7] = third.read24BitUnsignedInt();
  1145. particleDirectionZ[i_7] = third.read24BitUnsignedInt();
  1146. }
  1147.  
  1148. particleLifespanX[i_7] = fourth.readByte();
  1149. particleLifespanY[i_7] = fifth.readByte();
  1150. particleLifespanZ[i_7] = sixth.readByte();
  1151. }
  1152. }
  1153.  
  1154. }
  1155.  
  1156. public RSMesh(RSMesh[] meshes, int size) {
  1157. vertexCount = 0;
  1158. faceCount = 0;
  1159. texturedFaceCount = 0;
  1160. int i_3 = 0;
  1161. int i_4 = 0;
  1162. int i_5 = 0;
  1163. boolean faceTypes = false;
  1164. boolean bool_7 = false;
  1165. boolean bool_8 = false;
  1166. boolean bool_9 = false;
  1167. boolean bool_10 = false;
  1168. boolean bool_11 = false;
  1169. priority = -1;
  1170.  
  1171. int index;
  1172. for (index = 0; index < size; index++) {
  1173. RSMesh mesh = meshes[index];
  1174. if (mesh != null) {
  1175. vertexCount += mesh.vertexCount;
  1176. faceCount += mesh.faceCount;
  1177. texturedFaceCount += mesh.texturedFaceCount;
  1178. if (mesh.particleConfig != null) {
  1179. i_3 += mesh.particleConfig.length;
  1180. }
  1181.  
  1182. if (mesh.surfaceSkins != null) {
  1183. i_4 += mesh.surfaceSkins.length;
  1184. }
  1185.  
  1186. if (mesh.isolatedVertexNormals != null) {
  1187. i_5 += mesh.isolatedVertexNormals.length;
  1188. }
  1189.  
  1190. faceTypes |= mesh.faceType != null;
  1191. if (mesh.facePriorities != null) {
  1192. bool_7 = true;
  1193. } else {
  1194. if (priority == -1) {
  1195. priority = mesh.priority;
  1196. }
  1197.  
  1198. if (priority != mesh.priority) {
  1199. bool_7 = true;
  1200. }
  1201. }
  1202.  
  1203. bool_8 |= mesh.faceAlphas != null;
  1204. bool_9 |= mesh.texturePos != null;
  1205. bool_10 |= mesh.faceTextures != null;
  1206. bool_11 |= mesh.textureSkins != null;
  1207. }
  1208. }
  1209.  
  1210. vertexX = new int[vertexCount];
  1211. vertexY = new int[vertexCount];
  1212. vertexZ = new int[vertexCount];
  1213. vertexSkins = new int[vertexCount];
  1214. aShortArray1980 = new short[vertexCount];
  1215. triangleX = new short[faceCount];
  1216. triangleY = new short[faceCount];
  1217. triangleZ = new short[faceCount];
  1218. if (faceTypes) {
  1219. faceType = new byte[faceCount];
  1220. }
  1221.  
  1222. if (bool_7) {
  1223. facePriorities = new byte[faceCount];
  1224. }
  1225.  
  1226. if (bool_8) {
  1227. faceAlphas = new byte[faceCount];
  1228. }
  1229.  
  1230. if (bool_9) {
  1231. texturePos = new byte[faceCount];
  1232. }
  1233.  
  1234. faceColor = new short[faceCount];
  1235. if (bool_10) {
  1236. faceTextures = new short[faceCount];
  1237. }
  1238.  
  1239. if (bool_11) {
  1240. textureSkins = new int[faceCount];
  1241. }
  1242.  
  1243. aShortArray1981 = new short[faceCount];
  1244. if (texturedFaceCount > 0) {
  1245. textureRenderTypes = new int[texturedFaceCount];
  1246. texTriX = new short[texturedFaceCount];
  1247. texTriY = new short[texturedFaceCount];
  1248. texTriZ = new short[texturedFaceCount];
  1249. particleDirectionX = new int[texturedFaceCount];
  1250. particleDirectionY = new int[texturedFaceCount];
  1251. particleDirectionZ = new int[texturedFaceCount];
  1252. particleLifespanX = new int[texturedFaceCount];
  1253. particleLifespanY = new int[texturedFaceCount];
  1254. particleLifespanZ = new int[texturedFaceCount];
  1255. texturePrimaryColor = new int[texturedFaceCount];
  1256. textureSecondaryColor = new int[texturedFaceCount];
  1257. }
  1258.  
  1259. if (i_5 > 0) {
  1260. isolatedVertexNormals = new VertexNormal[i_5];
  1261. }
  1262.  
  1263. if (i_3 > 0) {
  1264. particleConfig = new ParticleEmitterConfig[i_3];
  1265. }
  1266.  
  1267. if (i_4 > 0) {
  1268. surfaceSkins = new SurfaceSkin[i_4];
  1269. }
  1270.  
  1271. vertexCount = 0;
  1272. faceCount = 0;
  1273. texturedFaceCount = 0;
  1274. i_3 = 0;
  1275. i_4 = 0;
  1276. i_5 = 0;
  1277.  
  1278. int i_16;
  1279. for (index = 0; index < size; index++) {
  1280. short s_13 = (short) (1 << index);
  1281. RSMesh rsmesh_14 = meshes[index];
  1282. if (rsmesh_14 != null) {
  1283. int i_15;
  1284. if (rsmesh_14.isolatedVertexNormals != null) {
  1285. for (i_15 = 0; i_15 < rsmesh_14.isolatedVertexNormals.length; i_15++) {
  1286. VertexNormal normals = rsmesh_14.isolatedVertexNormals[i_15];
  1287. isolatedVertexNormals[i_5++] = normals.method1459(normals.anInt809 + faceCount);
  1288. }
  1289. }
  1290.  
  1291. for (i_15 = 0; i_15 < rsmesh_14.faceCount; i_15++) {
  1292. if (faceTypes && rsmesh_14.faceType != null) {
  1293. faceType[faceCount] = rsmesh_14.faceType[i_15];
  1294. }
  1295.  
  1296. if (bool_7) {
  1297. if (rsmesh_14.facePriorities != null) {
  1298. facePriorities[faceCount] = rsmesh_14.facePriorities[i_15];
  1299. } else {
  1300. facePriorities[faceCount] = rsmesh_14.priority;
  1301. }
  1302. }
  1303.  
  1304. if (bool_8 && rsmesh_14.faceAlphas != null) {
  1305. faceAlphas[faceCount] = rsmesh_14.faceAlphas[i_15];
  1306. }
  1307.  
  1308. if (bool_10) {
  1309. if (rsmesh_14.faceTextures != null) {
  1310. faceTextures[faceCount] = rsmesh_14.faceTextures[i_15];
  1311. } else {
  1312. faceTextures[faceCount] = -1;
  1313. }
  1314. }
  1315.  
  1316. if (bool_11) {
  1317. if (rsmesh_14.textureSkins != null) {
  1318. textureSkins[faceCount] = rsmesh_14.textureSkins[i_15];
  1319. } else {
  1320. textureSkins[faceCount] = -1;
  1321. }
  1322. }
  1323.  
  1324. triangleX[faceCount] = (short) method2657(rsmesh_14, rsmesh_14.triangleX[i_15], s_13);
  1325. triangleY[faceCount] = (short) method2657(rsmesh_14, rsmesh_14.triangleY[i_15], s_13);
  1326. triangleZ[faceCount] = (short) method2657(rsmesh_14, rsmesh_14.triangleZ[i_15], s_13);
  1327. aShortArray1981[faceCount] = s_13;
  1328. faceColor[faceCount] = rsmesh_14.faceColor[i_15];
  1329. ++faceCount;
  1330. }
  1331.  
  1332. if (rsmesh_14.particleConfig != null) {
  1333. for (i_15 = 0; i_15 < rsmesh_14.particleConfig.length; i_15++) {
  1334. i_16 = method2657(rsmesh_14, rsmesh_14.particleConfig[i_15].faceX, s_13);
  1335. int i_17 = method2657(rsmesh_14, rsmesh_14.particleConfig[i_15].faceY, s_13);
  1336. int i_18 = method2657(rsmesh_14, rsmesh_14.particleConfig[i_15].faceZ, s_13);
  1337. particleConfig[i_3] = rsmesh_14.particleConfig[i_15].method1488(i_16, i_17, i_18);
  1338. ++i_3;
  1339. }
  1340. }
  1341.  
  1342. if (rsmesh_14.surfaceSkins != null) {
  1343. for (i_15 = 0; i_15 < rsmesh_14.surfaceSkins.length; i_15++) {
  1344. i_16 = method2657(rsmesh_14, rsmesh_14.surfaceSkins[i_15].anInt2119, s_13);
  1345. surfaceSkins[i_4] = rsmesh_14.surfaceSkins[i_15].method2911(i_16);
  1346. ++i_4;
  1347. }
  1348. }
  1349. }
  1350. }
  1351.  
  1352. index = 0;
  1353. maxDepth = vertexCount;
  1354.  
  1355. for (int i_23 = 0; i_23 < size; i_23++) {
  1356. short s_19 = (short) (1 << i_23);
  1357. RSMesh rsmesh_20 = meshes[i_23];
  1358. if (rsmesh_20 != null) {
  1359. for (i_16 = 0; i_16 < rsmesh_20.faceCount; i_16++) {
  1360. if (bool_9) {
  1361. texturePos[index++] = (byte) (rsmesh_20.texturePos != null && rsmesh_20.texturePos[i_16] != -1 ? texturedFaceCount + rsmesh_20.texturePos[i_16] : -1);
  1362. }
  1363. }
  1364.  
  1365. for (i_16 = 0; i_16 < rsmesh_20.texturedFaceCount; i_16++) {
  1366. int b_24 = textureRenderTypes[texturedFaceCount] = rsmesh_20.textureRenderTypes[i_16];
  1367. if (b_24 == 0) {
  1368. texTriX[texturedFaceCount] = (short) method2657(rsmesh_20, rsmesh_20.texTriX[i_16], s_19);
  1369. texTriY[texturedFaceCount] = (short) method2657(rsmesh_20, rsmesh_20.texTriY[i_16], s_19);
  1370. texTriZ[texturedFaceCount] = (short) method2657(rsmesh_20, rsmesh_20.texTriZ[i_16], s_19);
  1371. }
  1372.  
  1373. if (b_24 >= 1 && b_24 <= 3) {
  1374. texTriX[texturedFaceCount] = rsmesh_20.texTriX[i_16];
  1375. texTriY[texturedFaceCount] = rsmesh_20.texTriY[i_16];
  1376. texTriZ[texturedFaceCount] = rsmesh_20.texTriZ[i_16];
  1377. particleDirectionX[texturedFaceCount] = rsmesh_20.particleDirectionX[i_16];
  1378. particleDirectionY[texturedFaceCount] = rsmesh_20.particleDirectionY[i_16];
  1379. particleDirectionZ[texturedFaceCount] = rsmesh_20.particleDirectionZ[i_16];
  1380. particleLifespanX[texturedFaceCount] = rsmesh_20.particleLifespanX[i_16];
  1381. particleLifespanY[texturedFaceCount] = rsmesh_20.particleLifespanY[i_16];
  1382. particleLifespanZ[texturedFaceCount] = rsmesh_20.particleLifespanZ[i_16];
  1383. }
  1384.  
  1385. if (b_24 == 2) {
  1386. texturePrimaryColor[texturedFaceCount] = rsmesh_20.texturePrimaryColor[i_16];
  1387. textureSecondaryColor[texturedFaceCount] = rsmesh_20.textureSecondaryColor[i_16];
  1388. }
  1389.  
  1390. ++texturedFaceCount;
  1391. }
  1392. }
  1393. }
  1394.  
  1395. }
  1396.  
  1397. public void recolour(short s_1, short s_2) {
  1398. for (int i_3 = 0; i_3 < faceCount; i_3++) {
  1399. if (faceColor[i_3] == s_1) {
  1400. faceColor[i_3] = s_2;
  1401. }
  1402. }
  1403.  
  1404. }
  1405.  
  1406. public void retexture(short s_1, short s_2) {
  1407. if (faceTextures != null) {
  1408. for (int i_3 = 0; i_3 < faceCount; i_3++) {
  1409. if (faceTextures[i_3] == s_1) {
  1410. faceTextures[i_3] = s_2;
  1411. }
  1412. }
  1413. }
  1414.  
  1415. }
  1416.  
  1417. int method2657(RSMesh rsmesh_1, int i_2, short s_3) {
  1418. int i_4 = rsmesh_1.vertexX[i_2];
  1419. int i_5 = rsmesh_1.vertexY[i_2];
  1420. int i_6 = rsmesh_1.vertexZ[i_2];
  1421.  
  1422. for (int i_7 = 0; i_7 < vertexCount; i_7++) {
  1423. if (i_4 == vertexX[i_7] && i_5 == vertexY[i_7] && i_6 == vertexZ[i_7]) {
  1424. aShortArray1980[i_7] |= s_3;
  1425. return i_7;
  1426. }
  1427. }
  1428.  
  1429. vertexX[vertexCount] = i_4;
  1430. vertexY[vertexCount] = i_5;
  1431. vertexZ[vertexCount] = i_6;
  1432. aShortArray1980[vertexCount] = s_3;
  1433. vertexSkins[vertexCount] = rsmesh_1.vertexSkins != null ? rsmesh_1.vertexSkins[i_2] : -1;
  1434. return vertexCount++;
  1435. }
  1436.  
  1437. public void upscale() {
  1438. int i_2;
  1439. for (i_2 = 0; i_2 < vertexCount; i_2++) {
  1440. vertexX[i_2] <<= 2;
  1441. vertexY[i_2] <<= 2;
  1442. vertexZ[i_2] <<= 2;
  1443. }
  1444.  
  1445. if (texturedFaceCount > 0 && particleDirectionX != null) {
  1446. for (i_2 = 0; i_2 < particleDirectionX.length; i_2++) {
  1447. particleDirectionX[i_2] <<= 2;
  1448. particleDirectionY[i_2] <<= 2;
  1449. if (textureRenderTypes[i_2] != 1) {
  1450. particleDirectionZ[i_2] <<= 2;
  1451. }
  1452. }
  1453. }
  1454.  
  1455. }
  1456. }
  1457. [/CODE]
  1458.  
  1459. [CODE]package com.cryo.cache.loaders;
  1460.  
  1461. import com.cryo.cache.Cache;
  1462. import com.cryo.cache.FileType;
  1463. import com.cryo.cache.IndexType;
  1464. import com.cryo.cache.io.InputStream;
  1465. import com.cryo.cache.loaders.model.ModelDefinitions;
  1466. import com.cryo.cache.loaders.model.RSMesh;
  1467.  
  1468. import java.util.Arrays;
  1469. import java.util.HashMap;
  1470.  
  1471. public class IdentiKitDefinition {
  1472.  
  1473. private int id;
  1474. private int[] modelIds;
  1475. private short[] originalColours;
  1476. private short[] replacementColours;
  1477. private short[] originalTextures;
  1478. private short[] replacementTextures;
  1479. private int[] headModels = {-1, -1, -1, -1, -1};
  1480.  
  1481. private static HashMap<Integer, IdentiKitDefinition> defs = new HashMap<>();
  1482.  
  1483. public static IdentiKitDefinition getIdentikitDefinition(int id) {
  1484. if (defs.containsKey(id)) return defs.get(id);
  1485. byte[] data = Cache.STORE.getIndex(IndexType.CONFIG).getFile(FileType.IDENTIKIT.getId(), id);
  1486. if (data == null) return null;
  1487. IdentiKitDefinition defs = new IdentiKitDefinition(id);
  1488. defs.decode(new InputStream(data));
  1489. IdentiKitDefinition.defs.put(id, defs);
  1490. return defs;
  1491. }
  1492.  
  1493. public IdentiKitDefinition(int id) {
  1494. this.id = id;
  1495. }
  1496.  
  1497. public RSMesh renderHead(boolean upscale) {
  1498. RSMesh[] meshes = new RSMesh[5];
  1499. int index = 0;
  1500. for (int i = 0; i < 5; i++) {
  1501. if (headModels[i] != -1) {
  1502. ModelDefinitions defs = ModelDefinitions.getModelDefinitions(headModels[i]);
  1503. if (defs != null)
  1504. meshes[index++] = defs.getMesh();
  1505. }
  1506. }
  1507. for (int i = 0; i < 5; i++) {
  1508. if (meshes[i] != null && meshes[i].version < 13)
  1509. meshes[i].upscale();
  1510. }
  1511. RSMesh mesh = new RSMesh(meshes, index);
  1512. if (originalColours != null) {
  1513. for (int i = 0; i < originalColours.length; i++) {
  1514. mesh.recolour(originalColours[i], replacementColours[i]);
  1515. }
  1516. }
  1517. if (originalTextures != null) {
  1518. for (int i = 0; i < originalTextures.length; i++) {
  1519. mesh.retexture(originalTextures[i], replacementTextures[i]);
  1520. }
  1521. }
  1522. return mesh;
  1523. }
  1524.  
  1525. public RSMesh renderBody() {
  1526. if (modelIds == null)
  1527. return null;
  1528. RSMesh[] meshes = new RSMesh[modelIds.length];
  1529. int index = 0;
  1530. while (index < modelIds.length) {
  1531. meshes[index] = ModelDefinitions.getModelDefinitions(modelIds[index]).getMesh();
  1532. ++index;
  1533. }
  1534. for (int i_5 = 0; i_5 < modelIds.length; i_5++) {
  1535. if (meshes[i_5].version < 13) {
  1536. meshes[i_5].upscale();
  1537. }
  1538. }
  1539. RSMesh mesh = meshes.length == 1 ? meshes[0] : new RSMesh(meshes, meshes.length);
  1540. if (mesh == null)
  1541. return null;
  1542. if (originalColours != null) {
  1543. for (index = 0; index < originalColours.length; index++) {
  1544. mesh.recolour(originalColours[index], replacementColours[index]);
  1545. }
  1546. }
  1547. if (originalTextures != null) {
  1548. for (index = 0; index < originalTextures.length; index++) {
  1549. mesh.retexture(originalTextures[index], replacementTextures[index]);
  1550. }
  1551. }
  1552. return mesh;
  1553. }
  1554.  
  1555. public void decode(int opcode, InputStream stream) {
  1556. if (opcode == 1)
  1557. stream.readUnsignedByte();
  1558. else if (opcode == 2) {
  1559. int count = stream.readUnsignedByte();
  1560. modelIds = new int[count];
  1561. for (int i = 0; i < count; i++) {
  1562. modelIds[i] = stream.readBigSmart();
  1563. }
  1564. } else if (opcode == 40) {
  1565. int count = stream.readUnsignedByte();
  1566. originalColours = new short[count];
  1567. replacementColours = new short[count];
  1568. for (int i = 0; i < count; i++) {
  1569. originalColours[i] = (short) stream.readUnsignedShort();
  1570. replacementColours[i] = (short) stream.readUnsignedShort();
  1571. }
  1572. } else if (opcode == 41) {
  1573. int count = stream.readUnsignedByte();
  1574. originalTextures = new short[count];
  1575. replacementTextures = new short[count];
  1576. for (int i = 0; i < count; i++) {
  1577. originalTextures[i] = (short) stream.readUnsignedShort();
  1578. replacementTextures[i] = (short) stream.readUnsignedShort();
  1579. }
  1580. } else if (opcode >= 60 && opcode < 70) {
  1581. headModels[opcode - 60] = stream.readBigSmart();
  1582. }
  1583. }
  1584.  
  1585. public void decode(InputStream stream) {
  1586. while (true) {
  1587. int opcode = stream.readUnsignedByte();
  1588. if (opcode == 0) break;
  1589. decode(opcode, stream);
  1590. }
  1591. }
  1592. }
  1593. [/CODE]
  1594.  
  1595. [CODE] public RSMesh getBodyMesh(boolean isFemale, MeshModifier modifier) {
  1596. int equip1;
  1597. int equip2;
  1598. int equip3;
  1599. if (isFemale) {
  1600. if (modifier != null && modifier.femaleBody != null) {
  1601. equip1 = modifier.femaleBody[0];
  1602. equip2 = modifier.femaleBody[1];
  1603. equip3 = modifier.femaleBody[2];
  1604. } else {
  1605. equip1 = femaleEquip1;
  1606. equip2 = femaleEquip2;
  1607. equip3 = femaleEquip3;
  1608. }
  1609. } else if (modifier != null && modifier.maleBody != null) {
  1610. equip1 = modifier.maleBody[0];
  1611. equip2 = modifier.maleBody[1];
  1612. equip3 = modifier.maleBody[2];
  1613. } else {
  1614. equip1 = maleEquip1;
  1615. equip2 = maleEquip2;
  1616. equip3 = maleEquip3;
  1617. }
  1618. if (equip1 == -1)
  1619. return null;
  1620. ModelDefinitions defs = ModelDefinitions.getModelDefinitions(equip1);
  1621. if(defs == null)
  1622. return null;
  1623. RSMesh mesh = defs.getMesh();
  1624. if (mesh == null)
  1625. return null;
  1626. if (mesh.version < 13)
  1627. mesh.upscale();
  1628. if (equip2 != -1) {
  1629. RSMesh equip2Mesh = ModelDefinitions.getModelDefinitions(equip2).getMesh();
  1630. if (equip2Mesh.version < 13)
  1631. equip2Mesh.upscale();
  1632. if (equip3 != -1) {
  1633. RSMesh equip3Mesh = ModelDefinitions.getModelDefinitions(equip3).getMesh();
  1634. if (equip3Mesh.version < 13)
  1635. equip3Mesh.upscale();
  1636. RSMesh[] meshes = {mesh, equip2Mesh, equip3Mesh};
  1637. mesh = new RSMesh(meshes, 3);
  1638. } else {
  1639. RSMesh[] meshes = {mesh, equip2Mesh};
  1640. mesh = new RSMesh(meshes, 2);
  1641. }
  1642. }
  1643. // if (!isFemale && (maleWearXOffset != 0 || maleWearYOffset != 0 || maleWearZOffset != 0))
  1644. // mesh.translate(maleWearXOffset, maleWearYOffset, maleWearZOffset);
  1645. // if (isFemale && (femaleWearXOffset != 0 || femaleWearYOffset != 0 || femaleWearZOffset != 0))
  1646. // mesh.translate(femaleWearXOffset, femaleWearYOffset, femaleWearZOffset);
  1647. int i;
  1648. short[] modified;
  1649. if (originalModelColours != null) {
  1650. if (modifier != null && modifier.modifiedColours != null)
  1651. modified = modifier.modifiedColours;
  1652. else
  1653. modified = modifiedModelColours;
  1654. System.out.println("MODIFYING COLOURS: "+Arrays.toString(originalModelColours));
  1655. for (i = 0; i < originalModelColours.length; i++)
  1656. mesh.recolour(originalModelColours[i], modified[i]);
  1657. }
  1658. if (originalTextureIds != null) {
  1659. if (modifier != null && modifier.modifiedTextures != null)
  1660. modified = modifier.modifiedTextures;
  1661. else
  1662. modified = modifiedTextureIds;
  1663. for (i = 0; i < originalTextureIds.length; i++)
  1664. mesh.retexture(originalTextureIds[i], modified[i]);
  1665. }
  1666. return mesh;
  1667. }
  1668.  
  1669. public RSMesh getHeadMesh(boolean isFemale, MeshModifier modifier) {
  1670. int headModel1;
  1671. int headModel2;
  1672. if (isFemale) {
  1673. if (modifier != null && modifier.femaleHead != null) {
  1674. headModel1 = modifier.femaleHead[0];
  1675. headModel2 = modifier.femaleHead[1];
  1676. } else {
  1677. headModel1 = femaleHead1;
  1678. headModel2 = femaleHead2;
  1679. }
  1680. } else if (modifier != null && modifier.maleHead != null) {
  1681. headModel1 = modifier.maleHead[0];
  1682. headModel2 = modifier.maleHead[1];
  1683. } else {
  1684. headModel1 = maleHead1;
  1685. headModel2 = maleHead2;
  1686. }
  1687. if (headModel1 == -1)
  1688. return null;
  1689. RSMesh mesh = ModelDefinitions.getModelDefinitions(headModel1).getMesh();
  1690. if (mesh.version < 13)
  1691. mesh.upscale();
  1692. if (headModel2 != -1) {
  1693. RSMesh mesh2 = ModelDefinitions.getModelDefinitions(headModel2).getMesh();
  1694. if (mesh2.version < 13)
  1695. mesh2.upscale();
  1696. RSMesh[] meshes = {mesh, mesh2};
  1697. mesh = new RSMesh(meshes, 2);
  1698. }
  1699. int i;
  1700. short[] modified;
  1701. if (originalModelColours != null) {
  1702. if (modifier != null && modifier.modifiedColours != null)
  1703. modified = modifier.modifiedColours;
  1704. else
  1705. modified = modifiedModelColours;
  1706. for (i = 0; i < originalModelColours.length; i++)
  1707. mesh.recolour(originalModelColours[i], modified[i]);
  1708. }
  1709. if (originalTextureIds != null) {
  1710. if (modifier != null && modifier.modifiedTextures != null)
  1711. modified = modifier.modifiedTextures;
  1712. else
  1713. modified = modifiedTextureIds;
  1714. for (i = 0; i < originalTextureIds.length; i++)
  1715. mesh.retexture(originalTextureIds[i], modified[i]);
  1716. }
  1717. return mesh;
  1718. }[/CODE]
  1719.  
  1720. [SPOILER="Animations"]
  1721. The following are the JS files needed for animations. The definitions need to be loaded server sided, and added to the mesh. You can see how we grab that data in the model-viewer.js file above.
  1722. The definitions can be taken from the client. Suggestion: https://github.com/titandino/darkan-game-client
  1723.  
  1724. [CODE]var Animation = Animation || {};
  1725.  
  1726. Animation.Animation = function Animation() {
  1727.  
  1728. this.frameManager = new FrameManager.FrameManager();
  1729.  
  1730. this.setupAnimation = function(id, defs, speed = 0, i_3 = 0, bool_4 = false, bool_5 = true) {
  1731. if (id == this.getCurrentAnimation()) return;
  1732. if (id == -1) {
  1733. this.id = -1;
  1734. this.defs = null;
  1735. this.resetFrames();
  1736. return;
  1737. }
  1738. if (this.defs != null && this.defs.Id == id) {
  1739. if (this.defs.ReplayMode == 0) return;
  1740. } else
  1741. this.defs = defs;
  1742. this.anInt5459 = 0;
  1743. this.speed = speed;
  1744. this.anInt5461 = i_3;
  1745. this.aBool5456 = bool_5;
  1746. if (bool_4) {
  1747. this.frame1Index = (Math.random() * this.defs.FrameHashes.length);
  1748. this.frame1Duration = (Math.random() * this.defs.FrameDurations[this.frame1Index]);
  1749. } else {
  1750. this.frame1Index = 0;
  1751. this.frame1Duration = 0;
  1752. }
  1753. this.frame2Index = this.frame1Index + 1;
  1754. if (this.frame2Index >= this.defs.FrameHashes.length)
  1755. this.frame2Index = -1;
  1756. if (this.speed == 0) {
  1757. //play animation sound
  1758. }
  1759. this.aBool5462 = false;
  1760. this.resetFrames();
  1761. }
  1762.  
  1763. this.increaseIndex = function() {
  1764. this.frame1Index++;
  1765. this.frame2Index++;
  1766. if (this.frame2Index >= this.defs.FrameHashes.length)
  1767. this.frame2Index = 0;
  1768. }
  1769.  
  1770. this.getABool5462 = function() {
  1771. return this.aBool5462 == true;
  1772. }
  1773.  
  1774. this.setupLoop = function(loopStart) {
  1775. if (this.defs == null || loopStart == 0) return false;
  1776. if (this.speed > 0) {
  1777. if (this.speed >= loopStart) {
  1778. this.speed -= loopStart;
  1779. return false;
  1780. }
  1781. loopStart -= this.speed;
  1782. this.speed = 0;
  1783. //play animation sound
  1784. }
  1785. loopStart += this.frame1Duration;
  1786. let bool_3 = this.defs.Tweened;
  1787. if (loopStart > 100 && this.defs.LoopDelay > 0) {
  1788. let i_4;
  1789. for (let i_4 = this.defs.FrameHashes.length - this.defs.LoopDelay; this.frame1Index < i_4 && loopStart > this.defs.FrameDurations[this.frame1Index]; this.frame1Index++)
  1790. loopStart -= this.defs.FrameDurations[this.frame1Index];
  1791. if (this.frame1Index >= i_4) {
  1792. let totalDuration = 0;
  1793. for (let i = i_4; i < this.defs.FrameHashes.length; i++)
  1794. totalDuration += this.defs.FrameDurations[i];
  1795. if (this.anInt5461 == 0)
  1796. this.anInt5459 += loopStart / totalDuration;
  1797. loopStart %= totalDuration;
  1798. }
  1799. this.frame2Index = this.frame1Index + 1;
  1800. if (this.frame2Index >= this.defs.FrameHashes.length) {
  1801. if (this.defs.LoopDelay == -1 && this.aBool5456 == true)
  1802. this.frame2Index = 0;
  1803. else
  1804. this.frame2Index -= this.defs.LoopDelay;
  1805. if (this.frame2Index < 0 || this.frame2Index >= this.defs.FrameHashes.length)
  1806. this.frame2Index = -1;
  1807. }
  1808. bool_3 = true;
  1809. }
  1810. while (loopStart > this.defs.FrameDurations[this.frame1Index]) {
  1811. bool_3 = true;
  1812. loopStart -= this.defs.FrameDurations[this.frame1Index++];
  1813. if (this.frame1Index >= this.defs.FrameHashes.length) {
  1814. if (this.defs.LoopDelay != -1 && this.anInt5461 != 2) {
  1815. this.frame1Index -= this.defs.LoopDelay;
  1816. if (this.anInt5461 == 0)
  1817. this.anInt5459++;
  1818. }
  1819. if (this.anInt5459 >= this.defs.MaxLoops || this.frame1Index < 0 || this.frame1Index >= this.defs.FrameHashes.length) {
  1820. this.aBool5462 = true;
  1821. break;
  1822. }
  1823. }
  1824. //play sound
  1825. this.frame2Index = this.frame1Index + 1;
  1826. if (this.frame2Index >= this.defs.FrameHashes.length) {
  1827. if (this.defs.LoopDelay == -1 && this.aBool5456 == true)
  1828. this.frame2Index = 0;
  1829. else
  1830. this.frame2Index -= this.defs.LoopDelay;
  1831. if (this.frame2Index < 0 || this.frame2Index >= this.defs.FrameHashes.length)
  1832. this.frame2Index = -1;
  1833. }
  1834. }
  1835. this.frame1Duration = loopStart;
  1836. if (bool_3)
  1837. this.resetFrames();
  1838. return bool_3;
  1839. }
  1840.  
  1841. this.resetFrames = function() {
  1842. this.frameManager.resetFrames();
  1843. }
  1844.  
  1845. this.resetAnimation = function() {
  1846. this.frame1Index = 0;
  1847. this.frame2Index = this.defs.FrameHashes.length > 1 ? 1 : -1;
  1848. this.frame1Duration = 0;
  1849. this.aBool5462 = false;
  1850. this.speed = 0;
  1851. this.anInt5459 = 0;
  1852. this.resetFrames();
  1853. }
  1854.  
  1855. this.rasterize = async function(rasterizer, i_2) {
  1856. if (this.defs == null || this.defs.FrameHashes == null) return;
  1857. let setup = await this.setupAnimationFrames();
  1858. if (setup == true)
  1859. rasterizer.rasterize(this.frameManager.frameSet1, this.frameManager.frame1Id, this.frameManager.frameSet2, this.frameManager.frame2Id, this.frame1Duration, this.defs.FrameDurations[this.frame1Index], i_2, this.defs.ABool5923);
  1860. }
  1861.  
  1862. this.setupAnimationFrames = async function() {
  1863. if (this.defs == null) return false;
  1864. let setup = await this.frameManager.setupAnimationFrame(this.defs, this.frame1Index, this.frame2Index, this.defs.FrameHashes);
  1865. return setup;
  1866. }
  1867.  
  1868. this.getCurrentAnimation = function() {
  1869. return this.defs != null ? this.defs.Id : -1;
  1870. }
  1871.  
  1872. }[/CODE]
  1873.  
  1874. [CODE]var Rasterizer = Rasterizer || {};
  1875.  
  1876. Rasterizer.Rasterizer = function Rasterizer(model, cube) {
  1877.  
  1878. this.model = model;
  1879. this.cube = cube;
  1880. this.aBool7023 = false;
  1881. this.aBool8589 = false;
  1882. this.aBool8609 = false;
  1883.  
  1884. this.vertexCount = model.VertexCount;
  1885. this.faceCount = model.FaceCount;
  1886. this.vertexX = JSON.parse(JSON.stringify(model.VertexX));
  1887. this.vertexY = JSON.parse(JSON.stringify(model.VertexY));
  1888. this.vertexZ = JSON.parse(JSON.stringify(model.VertexZ));
  1889.  
  1890. this.xOffset = 0;
  1891. this.yOffset = 0;
  1892. this.zOffset = 0;
  1893.  
  1894. this.count = 0;
  1895.  
  1896. this.bones = this.model.AnimationBones;
  1897.  
  1898. this.trig = new Trig.Trig();
  1899.  
  1900. this.rasterize = function(frameSet1, frame1Id, frameSet2, frame2Id, i_5, i_6, i_7, bool_8) {
  1901. if (frame1Id == -1) return;
  1902. this.vertexX = JSON.parse(JSON.stringify(this.model.VertexX));
  1903. this.vertexY = JSON.parse(JSON.stringify(this.model.VertexY));
  1904. this.vertexZ = JSON.parse(JSON.stringify(this.model.VertexZ));
  1905. if (this.ea()) {
  1906. let frame1 = frameSet1.Frames[frame1Id];
  1907. let frameBase = frame1.FrameBase;
  1908. let frame2 = null;
  1909. if (frameSet2 != null) {
  1910. frame2 = frameSet2.Frames[frame2Id];
  1911. if (frameBase.Id != frame2.FrameBase.Id)
  1912. frame2 = null;
  1913. }
  1914. this.beginTransformation(frameBase, frame1, frame2, i_5, i_6, i_7, null, false, bool_8, 65535, null);
  1915. console.log(this.vertexX);
  1916. this.ka();
  1917. // this.roundToInts();
  1918. this.updateModel();
  1919. console.log(this.vertexX);
  1920. }
  1921. }
  1922.  
  1923. this.updateModel = function() {
  1924. let vertices = [];
  1925.  
  1926. let hasAlpha = this.model.FaceAlphas != null;
  1927. let hasFaceTypes = this.model.FaceType != null;
  1928.  
  1929. for (let i = 0; i < this.model.FaceCount; i++) {
  1930.  
  1931. let alpha = hasAlpha ? this.model.FaceAlphas[i] : 0;
  1932. if (alpha == -1) continue;
  1933.  
  1934. let faceType = hasFaceTypes ? this.model.FaceType[i] & 0x3 : 0;
  1935.  
  1936. let faceA, faceB, faceC;
  1937. switch (faceType) {
  1938. case 0:
  1939. case 1:
  1940. faceA = this.model.TriangleX[i];
  1941. faceB = this.model.TriangleY[i];
  1942. faceC = this.model.TriangleZ[i];
  1943. break;
  1944. case 2:
  1945. case 3:
  1946. faceA = this.model.TexTriX[i];
  1947. faceB = this.model.TexTriY[i];
  1948. faceC = this.model.TexTriZ[i];
  1949. break;
  1950. default:
  1951. throw new Error('Unknown face type=' + faceType);
  1952. }
  1953.  
  1954. vertices.push({ pos: [this.vertexX[faceA], this.vertexY[faceA], this.vertexZ[faceA]], norm: [faceA, faceB, faceC] });
  1955. vertices.push({ pos: [this.vertexX[faceB], this.vertexY[faceB], this.vertexZ[faceB]], norm: [faceA, faceB, faceC] });
  1956. vertices.push({ pos: [this.vertexX[faceC], this.vertexY[faceC], this.vertexZ[faceC]], norm: [faceA, faceB, faceC] });
  1957. }
  1958.  
  1959. let positions = [];
  1960. let normals = [];
  1961. for (let vertex of vertices) {
  1962. positions.push(...vertex.pos);
  1963. normals.push(...vertex.norm);
  1964. }
  1965.  
  1966. this.cube.geometry.attributes.position.array = new Float32Array(positions);
  1967. this.cube.geometry.attributes.position.needsUpdate = true;
  1968. }
  1969.  
  1970. this.roundToInts = function() {
  1971. for (let i = 0; i < this.vertexX.length; i++)
  1972. this.vertexX[i] = Math.floor(this.vertexX[i]);
  1973.  
  1974. for (let i = 0; i < this.vertexY.length; i++)
  1975. this.vertexY[i] = Math.floor(this.vertexY[i]);
  1976.  
  1977. for (let i = 0; i < this.vertexZ.length; i++)
  1978. this.vertexZ[i] = Math.floor(this.vertexZ[i]);
  1979. }
  1980.  
  1981. this.ka = function() {
  1982. if (this.aBool8589 == true) {
  1983. for (let i = 0; i < this.vertexCount; i++) {
  1984. this.vertexX[i] = this.vertexX[i] + 7 >> 4;
  1985. this.vertexY[i] = this.vertexY[i] + 7 >> 4;
  1986. this.vertexZ[i] = this.vertexZ[i] + 7 >> 4;
  1987. }
  1988. this.aBool8589 = false;
  1989. }
  1990.  
  1991. if (this.aBool8609 == true) {
  1992. this.method13801();
  1993. this.aBool8609 = false;
  1994. }
  1995.  
  1996. this.aBool8621 = false;
  1997. }
  1998.  
  1999. this.method13801 = function() {
  2000. //missing some shit
  2001. this.method13802();
  2002. }
  2003.  
  2004. this.method13802 = function() {
  2005. for (let i = 0; i < faceCount; i++) {
  2006.  
  2007. }
  2008. }
  2009.  
  2010. this.ea = function() {
  2011. if (this.bones == null)
  2012. return false;
  2013. this.xOffset = 0;
  2014. this.yOffset = 0;
  2015. this.zOffset = 0;
  2016. return true;
  2017. }
  2018.  
  2019. this.beginTransformation = function(frameBase, frame1, frame2, i_4, i_5, i_6, bools_7, bool_8, bool_9, modelIndex, ints_11) {
  2020. let i_12;
  2021. if (frame2 != null && i_4 != 0) {
  2022. i_12 = 0;
  2023. let i_35 = 0;
  2024. for (let index = 0; index < frameBase.Count; index++) {
  2025. let bool_15 = false;
  2026. if (i_12 < frame1.TransformationCount && index == frame1.TransformationIndices[i_12])
  2027. bool_15 = true;
  2028.  
  2029. let bool_16 = false;
  2030. if (i_35 < frame2.TransformationCount && index == frame2.TransformationIndices[i_35])
  2031. bool_16 = true;
  2032.  
  2033. if (bool_15 == true || bool_16 == true) {
  2034. if (bools_7 != null && bools_7[index] != bool_8 && frameBase.TransformationTypes[index] != 0) {
  2035. if (bool_15)
  2036. i_12++;
  2037.  
  2038. if (bool_16)
  2039. i_35++;
  2040. } else {
  2041. let s_17 = 0;
  2042. let type = frameBase.TransformationTypes[index];
  2043. if (type == 3 || type == 10)
  2044. s_17 = 128;
  2045.  
  2046. let frame1TransformX, frame1TransformY, frame1TransformZ, frame1Skip, frame1Flag;
  2047. let frame2TransformX, frame2TransformY, frame2TransformZ, frame2Skip, frame2Flag;
  2048.  
  2049. if (bool_15) {
  2050. frame1TransformX = frame1.TransformationX[i_12];
  2051. frame1TransformY = frame1.TransformationY[i_12];
  2052. frame1TransformZ = frame1.TransformationZ[i_12];
  2053. frame1Skip = frame1.SkippedReferences[i_12];
  2054. frame1Flag = frame1.TransformationFlags[i_12];
  2055. i_12++;
  2056. } else {
  2057. frame1TransformX = s_17;
  2058. frame1TransformY = s_17;
  2059. frame1TransformZ = s_17;
  2060. frame1Skip = -1;
  2061. frame1Flag = 0;
  2062. }
  2063.  
  2064. if (bool_16) {
  2065. frame2TransformX = frame2.TransformationX[i_35];
  2066. frame2TransformY = frame2.TransformationY[i_35];
  2067. frame2TransformZ = frame2.TransformationZ[i_35];
  2068. frame2Skip = frame2.SkippedReferences[i_35];
  2069. frame2Flag = frame2.TransformationFlags[i_35];
  2070. i_35++;
  2071. } else {
  2072. frame2TransformX = s_17;
  2073. frame2TransformY = s_17;
  2074. frame2TransformZ = s_17;
  2075. frame2Skip = -1;
  2076. frame2Flag = 0;
  2077. }
  2078.  
  2079. let x, y, z;
  2080. if ((frame1Flag & 0x2) == 0 && (frame2Flag & 0x1) == 0) {
  2081. let i_32;
  2082. if (type == 2) {
  2083. i_32 = frame2TransformX - frame1TransformX & 0x3FFF;
  2084. let i_33 = frame2TransformY - frame1TransformY & 0x3FFF;
  2085. let i_34 = frame2TransformZ - frame1TransformZ & 0x3FFF;
  2086. if (i_32 >= 8192)
  2087. i_32 -= 16384;
  2088.  
  2089. if (i_33 >= 8192)
  2090. i_33 -= 16384;
  2091.  
  2092. if (i_34 >= 8192)
  2093. i_34 -= 16384;
  2094.  
  2095. x = frame1TransformX + i_32 * i_4 / i_5 & 0x3FFF;
  2096. y = frame1TransformY + i_33 * i_4 / i_5 & 0x3FFF;
  2097. z = frame1TransformZ + i_34 * i_4 / i_5 & 0x3FFF;
  2098. } else if (type == 7) {
  2099. i_32 = frame2TransformX - frame1TransformX & 0x3F;
  2100. if (i_32 >= 32)
  2101. i_32 -= 64;
  2102.  
  2103. x = frame1TransformX + i_32 * i_4 / i_5 & 0x3F;
  2104. y = frame1TransformY + (frame2TransformY - frame1TransformY) * i_4 / i_5;
  2105. z = frame1TransformZ + (frame2TransformZ - frame1TransformZ) * i_4 / i_5;
  2106. } else if (type == 9) {
  2107. i_32 = frame2TransformX - frame1TransformX & 0x3FFF;
  2108. if (i_32 >= 8192)
  2109. i_32 -= 16384;
  2110.  
  2111. x = frame1TransformX + i_32 * i_4 / i_5 & 0x3FFF;
  2112. z = 0;
  2113. y = 0;
  2114. } else {
  2115. x = frame1TransformX + (frame2TransformX - frame1TransformX) * i_4 / i_5;
  2116. y = frame1TransformY + (frame2TransformY - frame1TransformY) * i_4 / i_5;
  2117. z = frame1TransformZ + (frame2TransformZ - frame1TransformZ) * i_4 / i_5;
  2118. }
  2119. } else {
  2120. x = frame1TransformX;
  2121. y = frame1TransformY;
  2122. z = frame1TransformZ;
  2123. }
  2124.  
  2125. if (frame1Skip != -1)
  2126. this.transform(0, frameBase.Labels[frame1Skip], 0, 0, 0, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[frame1Skip], ints_11);
  2127. else if (frame2Skip != -1)
  2128. this.transform(0, frameBase.Labels[frame2Skip], 0, 0, 0, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[frame2Skip], ints_11);
  2129.  
  2130. this.transform(type, frameBase.Labels[index], x, y, z, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[index], ints_11);
  2131. }
  2132. }
  2133. }
  2134. } else {
  2135. for (let i = 0; i < frame1.TransformationCount; i++) {
  2136. let index = frame1.TransformationIndices[i];
  2137. if (bools_7 == null || bools_7[index] == bool_8 || frameBase.TransformationTypes[index] == 0) {
  2138. let skip = frame1.SkippedReferences[i];
  2139. if (skip != -1)
  2140. this.transform(0, frameBase.Labels[skip], 0, 0, 0, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[skip], ints_11);
  2141.  
  2142. this.transform(frameBase.TransformationTypes[index], frameBase.Labels[index], frame1.TransformationX[i], frame1.TransformationY[i], frame1.TransformationZ[i], i_6, bool_9, modelIndex & frameBase.AnIntArray7561[index], ints_11);
  2143. }
  2144. }
  2145. }
  2146. }
  2147.  
  2148. this.transform = function(type, labels, transformX, transformY, transformZ, i_6, bool_7, i_8, ints_9) {
  2149. let transformedX = transformX;
  2150. let transformedZ = transformZ;
  2151. let buffer;
  2152. if (i_6 == 1) {
  2153. if (type == 0 || type == 1) {
  2154. buffer = -transformedX;
  2155. transformedX = transformedZ;
  2156. transformedZ = buffer;
  2157. } else if (type == 2) {
  2158. buffer = transformedX;
  2159. transformedX = -transformedZ & 0x3FFF;
  2160. transformedZ = buffer & 0x3FFF;
  2161. } else if (type == 3) {
  2162. buffer = transformedX;
  2163. transformedX = transformedZ;
  2164. transformedZ = buffer;
  2165. }
  2166. } else if (i_6 == 2) {
  2167. if (type == 0 || type == 1) {
  2168. transformedX = -transformedX;
  2169. transformedZ = -transformedZ;
  2170. } else if (type == 2) {
  2171. transformedX = -transformedX & 0x3FFF;
  2172. transformedZ = -transformedZ & 0x3FFF;
  2173. }
  2174. } else if (i_6 == 3) {
  2175. if (type == 0 || type == 1) {
  2176. buffer = transformedX;
  2177. transformedX = -transformedZ;
  2178. transformedZ = buffer;
  2179. } else if (type == 2) {
  2180. buffer = transformedY;
  2181. transformedX = transformedZ & 0x3FFF;
  2182. transformedZ = -buffer & 0x3FFF;
  2183. } else if (type == 3) {
  2184. buffer = transformedX;
  2185. transformedX = transformedZ;
  2186. transformedZ = buffer;
  2187. }
  2188. }
  2189.  
  2190. if (i_8 != 65535)
  2191. this.transformWithExtra();
  2192. else
  2193. this.finishTransform(type, labels, transformedX, transformY, transformedZ, i_6, bool_7);
  2194. }
  2195.  
  2196. this.transformWithExtra = function() {
  2197. console.error('TRANSFORMED WITH EXTRA!!!! CODY!!!!');
  2198. }
  2199.  
  2200. this.finishTransform = function(type, labels, transformedX, transformedY, transformedZ, i_6, bool_7) {
  2201. let labelCount = labels.length;
  2202. if (type == 0) {
  2203. transformedX <<= 4;
  2204. transformedY <<= 4;
  2205. transformedZ <<= 4;
  2206. if (this.aBool8589 == false) {
  2207. for (let i = 0; i < this.vertexCount; i++) {
  2208. this.vertexX[i] <<= 4;
  2209. this.vertexY[i] <<= 4;
  2210. this.vertexZ[i] <<= 4;
  2211. }
  2212.  
  2213. this.aBool8589 = true;
  2214. }
  2215.  
  2216. let transformed = 0;
  2217. this.xOffset = 0;
  2218. this.yOffset = 0;
  2219. this.zOffset = 0;
  2220.  
  2221. for (let i = 0; i < labelCount; i++) {
  2222. let label = labels[i];
  2223. if (label < this.bones.length) {
  2224. let bones = this.bones[label];
  2225. for (let j = 0; j < bones.length; j++) {
  2226. let bone = bones[j];
  2227. this.xOffset += this.vertexX[bone];
  2228. this.yOffset += this.vertexY[bone];
  2229. this.zOffset += this.vertexZ[bone];
  2230. transformed++;
  2231. }
  2232. }
  2233. }
  2234.  
  2235. if (transformed > 0) {
  2236. this.xOffset = transformedX + this.xOffset / transformed;
  2237. this.yOffset = this.yOffset / transformed + transformedY;
  2238. this.zOffset = transformedZ + this.zOffset / transformed;
  2239. } else {
  2240. this.xOffset = transformedX;
  2241. this.yOffset = transformedY;
  2242. this.zOffset = transformedZ;
  2243. }
  2244. } else if (type == 1) {
  2245. transformedX <<= 4;
  2246. transformedY <<= 4;
  2247. transformedZ <<= 4;
  2248. if (this.aBool8589 == false) {
  2249. for (let i = 0; i < this.vertexCount; i++) {
  2250. this.vertexX[i] <<= 4;
  2251. this.vertexY[i] <<= 4;
  2252. this.vertexZ[i] <<= 4;
  2253. }
  2254.  
  2255. this.aBool8589 = true;
  2256. }
  2257.  
  2258. for (let i = 0; i < labelCount; i++) {
  2259. let label = labels[i];
  2260. if (label < this.bones.length) {
  2261. let bones = this.bones[label];
  2262. for (let j = 0; j < bones.length; j++) {
  2263. let bone = bones[j];
  2264. this.vertexX[bone] += transformedX;
  2265. this.vertexY[bone] += transformedY;
  2266. this.vertexZ[bone] += transformedZ;
  2267. }
  2268. }
  2269. }
  2270. } else if (type == 2) {
  2271. for (let i = 0; i < labelCount; i++) {
  2272. let label = labels[i];
  2273. if (label < this.bones.length) {
  2274. let bones = this.bones[label];
  2275. if ((i_6 & 0x1) == 0) {
  2276. for (let j = 0; j < bones.length; j++) {
  2277. let bone = bones[j];
  2278. this.vertexX[bone] -= this.xOffset;
  2279. this.vertexY[bone] -= this.yOffset;
  2280. this.vertexZ[bone] -= this.zOffset;
  2281.  
  2282. if (transformedZ != 0) {
  2283. let sine = this.trig.getSine(transformedZ);
  2284. let cosine = this.trig.getCosine(transformedZ);
  2285. let newX = sine * this.vertexY[bone] + cosine * this.vertexX[bone] + 16383 >> 14;
  2286. this.vertexY[bone] = cosine * this.vertexY[bone] - sine * this.vertexX[bone] + 16383 >> 14;
  2287. this.vertexX[bone] = newX;
  2288. }
  2289.  
  2290. if (transformedX != 0) {
  2291. let sine = this.trig.getSine(transformedX);
  2292. let cosine = this.trig.getCosine(transformedX);
  2293. let newY = cosine * this.vertexY[bone] - sine * this.vertexZ[bone] + 16383 >> 14;
  2294. this.vertexZ[bone] = sine * this.vertexY[bone] + cosine * this.vertexZ[bone] + 16383 >> 14;
  2295. this.vertexY[bone] = newY;
  2296. }
  2297.  
  2298. if (transformedY != 0) {
  2299. let sine = this.trig.getSine(transformedY);
  2300. let cosine = this.trig.getCosine(transformedY);
  2301. let x = sine * this.vertexZ[bone] + cosine * this.vertexX[bone] + 16383 >> 14;
  2302. this.vertexZ[bone] = cosine * this.vertexZ[bone] - sine * this.vertexX[bone] + 16383 >> 14;
  2303. this.vertexX[bone] = x;
  2304. }
  2305.  
  2306. this.vertexX[bone] += this.xOffset;
  2307. this.vertexY[bone] += this.yOffset;
  2308. this.vertexZ[bone] += this.zOffset;
  2309.  
  2310. }
  2311. } else {
  2312. for (let j = 0; j < bones.length; j++) {
  2313. let bone = bones[j];
  2314. this.vertexX[bone] -= this.xOffset;
  2315. this.vertexY[bone] -= this.yOffset;
  2316. this.vertexZ[bone] -= this.zOffset;
  2317.  
  2318. if (transformedX != 0) {
  2319. let sine = this.trig.getSine(transformedX);
  2320. let cosine = this.trig.getCosine(transformedX);
  2321. this.vertexZ[bone] = sine * this.vertexY[bone] + cosine * this.vertexZ[bone] + 16383 >> 14;
  2322. this.vertexY[bone] = cosine * this.vertexY[bone] - sine * this.vertexZ[bone] + 16383 >> 14;
  2323. }
  2324.  
  2325. if (transformedZ != 0) {
  2326. let sine = this.trig.getSine(transformedZ);
  2327. let cosine = this.trig.getCosine(transformedZ);
  2328. this.vertexY[bone] = cosine * this.vertexY[bone] - sine * this.vertexX[bone] + 16383 >> 14;
  2329. this.vertexX[bone] = sine * this.vertexY[bone] + cosine * this.vertexX[bone] + 16383 >> 14;
  2330. }
  2331.  
  2332. if (transformedY != 0) {
  2333. let sine = this.trig.getSine(transformedY);
  2334. let cosine = this.trig.getCosine(transformedY);
  2335. this.vertexZ[bone] = cosine * this.vertexZ[bone] - sine * this.vertexX[bone] + 16383 >> 14;
  2336. this.vertexX[bone] = sine * this.vertexZ[bone] + cosine * this.vertexX[bone] + 16383 >> 14;
  2337. }
  2338.  
  2339. this.vertexX[bone] += this.xOffset;
  2340. this.vertexY[bone] += this.yOffset;
  2341. this.vertexZ[bone] += this.zOffset;
  2342. }
  2343. }
  2344. }
  2345. }
  2346. } else {
  2347. console.error('UNHANDLED TYPE: ' + type);
  2348. }
  2349. }
  2350.  
  2351. }[/CODE]
  2352.  
  2353. [CODE]var FrameManager = FrameManager || {};
  2354.  
  2355. FrameManager.FrameManager = function FrameManager() {
  2356.  
  2357. this.frameLoaded = false;
  2358.  
  2359. this.sets = [];
  2360. this.flag = 0;
  2361.  
  2362. this.getFrameSet = async function(id) {
  2363. if (this.sets[id]) return this.sets[id];
  2364. let set = await Promise.resolve($.post('/animations/sets/' + id, {}));
  2365. let data = parseJSON(set);
  2366. this.sets[id] = JSON.parse(data.set);
  2367. return this.sets[id];
  2368. }
  2369.  
  2370. this.setupAnimationFrame = async function(defs, frame1Index, frame2Index, frames) {
  2371. if (this.frameLoaded) return true;
  2372. if (frame1Index >= frames.length)
  2373. return false;
  2374. this.frame1Id = frames[frame1Index];
  2375. try {
  2376. this.frameSet1 = await this.getFrameSet(this.frame1Id >> 16);
  2377. } catch (error) {
  2378. console.error(error);
  2379. return false;
  2380. }
  2381. this.frame1Id &= 0xFFFF;
  2382. if (this.frameSet1 == null) return false;
  2383. if (defs.Tweened && frame2Index != -1 && frame2Index < frames.length) {
  2384. this.frame2Id = frames[frame2Index];
  2385. try {
  2386. this.frameSet2 = await this.getFrameSet(this.frame2Id >> 16);
  2387. this.frame2Id &= 0xFFFF;
  2388. } catch (error) {
  2389. console.error(error);
  2390. }
  2391. }
  2392. if (defs.ABool5923)
  2393. this.flag |= 0x200;
  2394.  
  2395. if (this.frameSet1.Frames[this.frame1Id].ModifiesColour)
  2396. this.flag |= 0x80;
  2397. if (this.frameSet1.Frames[this.frame1Id].ModifiesAlpha)
  2398. this.flag |= 0x100;
  2399. if (this.frameSet1.Frames[this.frame1Id].ABool988)
  2400. this.flag |= 0x400;
  2401.  
  2402. if (this.frameSet2 != null) {
  2403.  
  2404. if (this.frameSet2.Frames[this.frame1Id].ModifiesColour)
  2405. this.flag |= 0x80;
  2406. if (this.frameSet2.Frames[this.frame1Id].ModifiesAlpha)
  2407. this.flag |= 0x100;
  2408. if (this.frameSet2.Frames[this.frame1Id].ABool988)
  2409. this.flag |= 0x400;
  2410.  
  2411. }
  2412.  
  2413. this.flag |= 0x20;
  2414. this.frameLoaded = true;
  2415. return true;
  2416. }
  2417.  
  2418. this.resetFrames = function() {
  2419. this.frameLoaded = false;
  2420. this.flag = 0;
  2421. this.frameSet1 = null;
  2422. this.frameSet2 = null;
  2423. }
  2424.  
  2425. }
  2426.  
  2427. FrameManager.Manager = function Manager(model, getCube) {
  2428.  
  2429. var framesReady = false;
  2430. var frame1Id, frame2Id;
  2431. var frameSet1, frameSet2;
  2432. var frame1Index, frame2Index;
  2433. var xOffset, yOffset, zOffset;
  2434. let vertexX = JSON.parse(JSON.stringify(model.VertexX));
  2435. let vertexY = JSON.parse(JSON.stringify(model.VertexY));
  2436. let vertexZ = JSON.parse(JSON.stringify(model.VertexZ));
  2437. var flag = 0;
  2438.  
  2439. let cube;
  2440.  
  2441. let trig = new Trig.Trig();
  2442.  
  2443. let sets = [];
  2444.  
  2445. let count = 0;
  2446.  
  2447. this.getFrameSetData = async function(id) {
  2448. if (sets[id]) return sets[id];
  2449. let set = await Promise.resolve($.post('/animations/sets/' + id, {}));
  2450. let data = parseJSON(set);
  2451. sets[id] = JSON.parse(data.set);
  2452. return sets[id];
  2453. }
  2454.  
  2455. this.setupAnimationFrames = async function(defs, frame1Ind, frame2Ind, frames) {
  2456. if (framesReady == true) return true;
  2457. if (frame1Ind > frames.length)
  2458. return false;
  2459. this.defs = defs;
  2460. frame1Index = frame1Ind;
  2461. frame2Index = frame2Ind;
  2462.  
  2463. frame1Id = frames[frame1Index];
  2464. try {
  2465. frameSet1 = await this.getFrameSetData(frame1Id >> 16);
  2466. } catch (exception) {
  2467. return;
  2468. }
  2469.  
  2470. frame1Id &= 0xFFFF;
  2471. if (frameSet1 == null)
  2472. return false;
  2473. if (defs.Tweened === true && frame2Index != -1 && frame2Index < frames.length) {
  2474. frame2Id = frames[frame2Index];
  2475. try {
  2476. frameSet2 = await this.getFrameSetData(frame2Id >> 16);
  2477. } catch (exception) {
  2478. return false;
  2479. }
  2480. frame2Id &= 0xFFFF;
  2481. }
  2482. if (defs.ABool5923 === true)
  2483. flag |= 0x200;
  2484.  
  2485. if (frameSet1.Frames[frame1Id].ModifiesColour)
  2486. flag |= 0x80;
  2487.  
  2488. if (frameSet1.Frames[frame1Id].ModifiesAlpha)
  2489. flag |= 0x100;
  2490.  
  2491. if (frameSet1.Frames[frame1Id].ABool988)
  2492. flag |= 0x400;
  2493.  
  2494. if (frameSet2 != null) {
  2495. if (!frameSet2.Frames[frame2Id])
  2496. console.log('Frame null: ' + frameSet2.Frames.length, frame2Id);
  2497. else {
  2498. if (frameSet2.Frames[frame2Id].ModifiesColour)
  2499. flag |= 0x80;
  2500. if (frameSet2.Frames[frame2Id].ModifiesAlpha)
  2501. flag |= 0x100;
  2502. if (frameSet2.Frames[frame2Id].ABool988)
  2503. flag |= 0x400;
  2504. }
  2505. }
  2506.  
  2507. flag |= 0x20;
  2508. framesReady = true;
  2509. return true;
  2510. }
  2511.  
  2512. this.playFrame = function(i_5, duration, i_7, bool_8) {
  2513. if (frame1Id == -1) return;
  2514. let frame1 = frameSet1.Frames[frame1Id];
  2515. let frameBase = frame1.FrameBase;
  2516. let frame2 = null;
  2517. if (frameSet2 != null) {
  2518. frame2 = frameSet2.Frames[frame2Id];
  2519. if (frame2.FrameBase.Id != frameBase.Id)
  2520. frame2 = null;
  2521. }
  2522. vertexX = JSON.parse(JSON.stringify(model.VertexX));
  2523. vertexY = JSON.parse(JSON.stringify(model.VertexY));
  2524. vertexZ = JSON.parse(JSON.stringify(model.VertexZ));
  2525. this.setupTransformations(frameBase, frame1, frame2, i_5, duration, i_7, null, false, bool_8, 65535, null);
  2526.  
  2527. }
  2528.  
  2529. this.setupTransformations = function(frameBase, frame1, frame2, i_4, duration, i_6, bools_7, bool_8, bool_9, modelIndex, ints_11) {
  2530. if (frame2 != null && i_4 != 0) {
  2531. let i_12 = 0;
  2532. let i_35 = 0;
  2533. for (let frameIndex = 0; frameIndex < frameBase.Count; frameIndex++) {
  2534. let bool_15 = false;
  2535. if (i_12 < frame1.TransformationCount && frameIndex == frame1.TransformationIndices[i_12])
  2536. bool_15 = true;
  2537.  
  2538. let bool_16 = false;
  2539. if (i_35 < frame2.TransformationCount && frameIndex == frame2.TransformationIndices[i_35])
  2540. bool_16 = true;
  2541.  
  2542. if (bool_15 || bool_16) {
  2543. if (bools_7 != null && bools_7[frameIndex] != bool_8 && frameBase.TransformationTypes[frameIndex] != 0) {
  2544. if (bool_15)
  2545. i_12++;
  2546.  
  2547. if (bool_16)
  2548. i_35++;
  2549. } else {
  2550. let s_17 = 0;
  2551. let type = frameBase.TransformationTypes[frameIndex];
  2552. if (type == 3 || type == 10)
  2553. s_17 = 128;
  2554.  
  2555. let frame1X, frame1Y, frame1Z, frame1Skip, frame1Flag;
  2556. if (bool_15) {
  2557. frame1X = frame1.TransformationX[i_12];
  2558. frame1Y = frame1.TransformationY[i_12];
  2559. frame1Z = frame1.TransformationZ[i_12];
  2560. frame1Skip = frame1.SkippedReferences[i_12];
  2561. frame1Flag = frame1.TransformationFlags[i_12];
  2562. i_12++;
  2563. } else {
  2564. frame1X = s_17;
  2565. frame1Y = s_17;
  2566. frame1Z = s_17;
  2567. frame1Skip = -1;
  2568. frame1Flag = 0;
  2569. }
  2570.  
  2571. let frame2X, frame2Y, frame2Z, frame2Skip, frame2Flag;
  2572. if (bool_16) {
  2573. frame2X = frame2.TransformationX[i_35];
  2574. frame2Y = frame2.TransformationY[i_35];
  2575. frame2Z = frame2.TransformationZ[i_35];
  2576. frame2Skip = frame2.SkippedReferences[i_35];
  2577. frame2Flag = frame2.TransformationFlags[i_35];
  2578. i_35++;
  2579. } else {
  2580. frame2X = s_17;
  2581. frame2Y = s_17;
  2582. frame2Z = s_17;
  2583. frame2Skip = -1;
  2584. frame2Flag = 0;
  2585. }
  2586.  
  2587. let i_29;
  2588. let i_30;
  2589. let i_31;
  2590. if ((frame1Flag & 0x2) == 0 && (frame2Flag & 0x1) == 0) {
  2591. let i_32;
  2592. if (type == 2) {
  2593. i_32 = frame2X - frame1X & 0x3FFF;
  2594. let i_33 = frame2Y - frame1Y & 0x3FFF;
  2595. let i_34 = frame2Z - frame1Z & 0x3FFF;
  2596. if (i_32 >= 8192)
  2597. i_32 -= 16384;
  2598. if (i_33 >= 8192)
  2599. i_33 -= 16384;
  2600. if (i_34 >= 8192)
  2601. i_34 -= 16384;
  2602.  
  2603. i_29 = frame1X + i_32 * i_4 / duration & 0x3FFF;
  2604. i_30 = frame1Y + i_33 * i_4 / duration & 0x3FFF;
  2605. i_31 = frame1Z + i_34 * i_4 / duration & 0x3FFF;
  2606. } else if (type == 7) {
  2607. i_32 = frame2X - frame1X & 0x3f;
  2608. if (i_32 >= 32)
  2609. i_32 -= 64;
  2610.  
  2611. i_29 = frame1X + i_32 * i_4 / duration & 0x3f;
  2612. i_30 = frame1Y + (frame2Y - frame1Y) * i_4 / duration;
  2613. i_31 = frame1Z + (frame2Z - frame1Z) * i_4 / duration;
  2614. } else if (type == 9) {
  2615. i_32 = frame2X - frame1X & 0x3FFF;
  2616. if (i_32 >= 8192)
  2617. i_32 -= 16384;
  2618.  
  2619. i_29 = frame1X + i_32 * i_4 / duration & 0x3FFF;
  2620. i_31 = 0;
  2621. i_30 = 0;
  2622. } else {
  2623. i_29 = frame1X + (frame2X - frame1X) * i_4 / duration;
  2624. i_30 = frame1Y + (frame2Y - frame1Y) * i_4 / duration;
  2625. i_31 = frame1Z + (frame2Z - frame1Z) * i_4 / duration;
  2626. }
  2627. } else {
  2628. i_29 = frame1X;
  2629. i_30 = frame1Y;
  2630. i_31 = frame1Z;
  2631. }
  2632. if (frame1Skip != -1)
  2633. this.setupTransformation(0, frameBase.Labels[frame1Skip], 0, 0, 0, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[frame1Skip], ints_11);
  2634. else if (frame2Skip != -1)
  2635. this.setupTransformation(0, frameBase.Labels[frame2Skip], 0, 0, 0, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[frame2Skip], ints_11);
  2636. this.setupTransformation(type, frameBase.Labels[frameIndex], i_29, i_30, i_31, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[frameIndex], ints_11);
  2637. }
  2638. }
  2639. }
  2640. } else {
  2641. for (let i = 0; i < frame1.TransformationCount; i++) {
  2642. let index = frame1.TransformationIndices[i];
  2643. if (bools_7 == null || bools_7[index] == bool_8 || frameBase.TransformationTypes[index] == 0) {
  2644. let skipped = frame1.SkippedReferences[i];
  2645. if (skipped != -1)
  2646. this.setupTransformation(0, frameBase.Labels[skipped], 0, 0, 0, i_6, bool_9, modelIndex & frameBase.AnIntArray7561[skipped], ints_11);
  2647. this.setupTransformation(frameBase.TransformationTypes[index], frameBase.Labels[index], frame1.TransformationX[i], frame1.TransformationY[i], frame1.TransformationZ[i], i_6, bool_9, modelIndex & frameBase.AnIntArray7561[index], ints_11);
  2648. }
  2649. }
  2650. }
  2651. this.updateModel();
  2652. }
  2653.  
  2654. this.setupTransformation = function(type, labels, transformX, transformY, transformZ, i_6, bool_7, i_8, ints_9) {
  2655. let transformedX = transformX;
  2656. let transformedZ = transformZ;
  2657. let buffer;
  2658. if (i_6 == 1) {
  2659. if (type == 0 || type == 1) {
  2660. buffer = -transformedX;
  2661. transformedX = transformedZ;
  2662. transformedZ = buffer;
  2663. } else if (type == 2) {
  2664. buffer = transformedX;
  2665. transformedX = -transformedZ & 0x3FFF;
  2666. transformedZ = buffer & 0x3FFF;
  2667. } else if (type == 3) {
  2668. buffer = transformedX;
  2669. transformedX = transformedZ;
  2670. transformedZ = buffer;
  2671. }
  2672. } else if (i_6 == 2) {
  2673. if (type == 0 || type == 1) {
  2674. transformedX = -transformedX;
  2675. transformedZ = -transformedZ;
  2676. } else if (type == 2) {
  2677. transformedX = -transformedX & 0x3FFF;
  2678. transformedZ = -transformedZ & 0x3FFF;
  2679. }
  2680. } else if (i_6 == 3) {
  2681. if (type == 0 || type == 1) {
  2682. buffer = transformedX;
  2683. transformedX = -transformedZ;
  2684. transformedZ = buffer;
  2685. } else if (type == 2) {
  2686. buffer = transformedX;
  2687. transformedX = transformedZ & 0x3FFF;
  2688. transformedZ = -buffer & 0x3FFF;
  2689. } else if (type == 3) {
  2690. buffer = transformedX;
  2691. transformedX = transformedZ;
  2692. transformedZ = buffer;
  2693. }
  2694. }
  2695.  
  2696. if (i_8 != 65535) {
  2697.  
  2698. } else {
  2699. this.startRenderingAnimation(type, labels, transformedX, transformY, transformedZ, i_6, bool_7);
  2700. }
  2701. }
  2702.  
  2703. this.startRenderingAnimation = function(type, labels, transformX, transformY, transformZ, i_6, bool_7) {
  2704. if (!cube)
  2705. cube = getCube();
  2706. let labelsCount = labels.length;
  2707. if (type == 0) {
  2708. // transformX <<= 4;
  2709. // transformY <<= 4;
  2710. // transformZ <<= 4;
  2711. if (!this.aBool8589) {
  2712. for (let i = 0; i < model.VertexCount; i++) {
  2713. // vertexX[i] <<= 4;
  2714. // vertexY[i] <<= 4;
  2715. // vertexZ[i] <<= 4;
  2716. }
  2717. this.aBool8589 = true;
  2718. }
  2719.  
  2720. xOffset = 0;
  2721. yOffset = 0;
  2722. zOffset = 0;
  2723. let transformed = 0;
  2724.  
  2725. for (let i = 0; i < labelsCount; i++) {
  2726. let label = labels[i];
  2727. if (label < model.AnimationBones.length) {
  2728. let bones = model.AnimationBones[label];
  2729. for (let j = 0; j < bones.length; j++) {
  2730. let bone = bones[j];
  2731. xOffset += vertexX[bone];
  2732. yOffset += vertexY[bone];
  2733. zOffset += vertexZ[bone];
  2734. transformed++;
  2735. }
  2736. }
  2737. }
  2738.  
  2739. if (transformed > 0) {
  2740. xOffset = xOffset / transformed + transformX;
  2741. yOffset = yOffset / transformed + transformY;
  2742. zOffset = zOffset / transformed + transformZ;
  2743. } else {
  2744. xOffset = transformX;
  2745. yOffset = transformY;
  2746. zOffset = transformZ;
  2747. }
  2748. } else if (type == 1) {
  2749. // transformX <<= 4;
  2750. // transformY <<= 4;
  2751. // transformZ <<= 4;
  2752. if (!this.aBool8589) {
  2753. for (let i = 0; i < model.VertexCount; i++) {
  2754. // vertexX[i] <<= 4;
  2755. // vertexY[i] <<= 4;
  2756. // vertexZ[i] <<= 4;
  2757. }
  2758. this.aBool8589 = true;
  2759. }
  2760.  
  2761. for (let i = 0; i < labelsCount; i++) {
  2762. let label = labels[i];
  2763. if (label < model.AnimationBones.length) {
  2764. let bones = model.AnimationBones[label];
  2765. for (let j = 0; j < bones.length; j++) {
  2766. let bone = bones[j];
  2767. vertexX[bone] += transformX;
  2768. vertexY[bone] += transformY;
  2769. vertexZ[bone] += transformZ;
  2770. }
  2771. }
  2772. }
  2773. } else if (type == 2) {
  2774. for (let i = 0; i < labelsCount; i++) {
  2775. let label = labels[i];
  2776. if (label < model.AnimationBones.length) {
  2777. let bones = model.AnimationBones[label];
  2778. if ((i_6 & 0x1) == 0) {
  2779. for (let j = 0; j < bones.length; j++) {
  2780. let bone = bones[j];
  2781. vertexX[bone] -= xOffset;
  2782. vertexY[bone] -= yOffset;
  2783. vertexZ[bone] -= zOffset;
  2784. if (transformZ != 0) {
  2785. let sine = trig.getSine(transformZ);
  2786. let cosine = trig.getCosine(transformZ);
  2787. vertexY[bone] = cosine * vertexY[bone] - sine * vertexX[bone] + 16383 >> 14;
  2788. vertexX[bone] = sine * vertexY[bone] + cosine * vertexX[bone] + 16383 >> 14;
  2789. }
  2790. if (transformX != 0) {
  2791. let sine = trig.getSine(transformX);
  2792. let cosine = trig.getCosine(transformX);
  2793. let z = sine * vertexY[bone] + cosine * vertexZ[bone] + 16383 >> 14;
  2794. let y = cosine * vertexY[bone] - sine * vertexZ[bone] + 16383 >> 14;
  2795. vertexZ[bone] = z;
  2796. vertexY[bone] = y;
  2797. }
  2798. if (transformY != 0) {
  2799. let sine = trig.getSine(transformY);
  2800. let cosine = trig.getCosine(transformY);
  2801. let z = cosine * vertexZ[bone] - sine * vertexX[bone] + 16383 >> 14;
  2802. let x = sine * vertexZ[bone] + cosine * vertexX[bone] + 16383 >> 14;
  2803. vertexZ[bone] = z;
  2804. vertexX[bone] = x;
  2805. }
  2806.  
  2807. vertexX[bone] += xOffset;
  2808. vertexY[bone] += yOffset;
  2809. vertexZ[bone] += zOffset;
  2810. }
  2811. } else {
  2812. for (let j = 0; j < bones.length; j++) {
  2813. let bone = bones[j];
  2814. vertexX[bone] -= xOffset;
  2815. vertexY[bone] -= yOffset;
  2816. vertexZ[bone] -= zOffset;
  2817. if (transformZ != 0) {
  2818. let sine = trig.getSine(transformZ);
  2819. let cosine = trig.getCosine(transformZ);
  2820. vertexY[bone] = cosine * vertexY[bone] - sine * vertexX[bone] + 16383 >> 14;
  2821. vertexX[bone] = sine * vertexY[bone] + cosine * vertexX[bone] + 16383 >> 14;
  2822. }
  2823. if (transformX != 0) {
  2824. let sine = trig.getSine(transformX);
  2825. let cosine = trig.getCosine(transformX);
  2826. vertexZ[bone] = sine * vertexY[bone] + cosine * vertexZ[bone] + 16383 >> 14;
  2827. vertexY[bone] = cosine * vertexY[bone] - sine * vertexZ[bone] + 16383 >> 14;
  2828. }
  2829. if (transformY != 0) {
  2830. let sine = trig.getSine(transformY);
  2831. let cosine = trig.getCosine(transformY);
  2832. vertexZ[bone] = cosine * vertexZ[bone] - sine * vertexX[bone] + 16383 >> 14;
  2833. vertexX[bone] = sine * vertexZ[bone] + cosine * vertexX[bone] + 16383 >> 14;
  2834. }
  2835.  
  2836. vertexX[bone] += xOffset;
  2837. vertexY[bone] += yOffset;
  2838. vertexZ[bone] += zOffset;
  2839. }
  2840. }
  2841. }
  2842. }
  2843. } else if (type == 3) {
  2844. for (let i = 0; i < labelsCount; i++) {
  2845. let label = labels[i];
  2846. if (label < model.AnimationBones.length) {
  2847. let bones = model.AnimationBones[label];
  2848. for (let j = 0; j < bones.length; j++) {
  2849. let bone = bones[j];
  2850. vertexX[bone] -= xOffset;
  2851. vertexY[bone] -= yOffset;
  2852. vertexZ[bone] -= zOffset;
  2853. vertexX[bone] = transformX * vertexX[bone] / 128;
  2854. vertexY[bone] = transformY * vertexY[bone] / 128;
  2855. vertexZ[bone] = transformZ * vertexZ[bone] / 128;
  2856. vertexX[bone] += xOffset;
  2857. vertexY[bone] += yOffset;
  2858. vertexZ[bone] += zOffset;
  2859. }
  2860. }
  2861. }
  2862. } else if (type == 5) {
  2863.  
  2864. }
  2865. this.roundToInts();
  2866. }
  2867.  
  2868. this.roundToInts = function() {
  2869. for (let i = 0; i < vertexX.length; i++)
  2870. vertexX[i] = Math.floor(vertexX[i]);
  2871.  
  2872. for (let i = 0; i < vertexY.length; i++)
  2873. vertexY[i] = Math.floor(vertexY[i]);
  2874.  
  2875. for (let i = 0; i < vertexZ.length; i++)
  2876. vertexZ[i] = Math.floor(vertexZ[i]);
  2877. }
  2878.  
  2879. this.resetModel = function() {
  2880. vertexX = JSON.parse(JSON.stringify(model.VertexX));
  2881. vertexY = JSON.parse(JSON.stringify(model.VertexY));
  2882. vertexZ = JSON.parse(JSON.stringify(model.VertexZ));
  2883. }
  2884.  
  2885. this.updateModel = function() {
  2886. let vertices = [];
  2887.  
  2888. let hasAlpha = model.FaceAlphas != null;
  2889. let hasFaceTypes = model.FaceType != null;
  2890.  
  2891. for (let i = 0; i < model.FaceCount; i++) {
  2892.  
  2893. let alpha = hasAlpha ? model.FaceAlphas[i] : 0;
  2894. if (alpha == -1) continue;
  2895.  
  2896. let faceType = hasFaceTypes ? model.FaceType[i] & 0x3 : 0;
  2897.  
  2898. let faceA, faceB, faceC;
  2899. switch (faceType) {
  2900. case 0:
  2901. case 1:
  2902. faceA = model.TriangleX[i];
  2903. faceB = model.TriangleY[i];
  2904. faceC = model.TriangleZ[i];
  2905. break;
  2906. case 2:
  2907. case 3:
  2908. faceA = model.TexTriX[i];
  2909. faceB = model.TexTriY[i];
  2910. faceC = model.TexTriZ[i];
  2911. break;
  2912. default:
  2913. throw new Error('Unknown face type=' + faceType);
  2914. }
  2915.  
  2916. vertices.push({ pos: [vertexX[faceA], vertexY[faceA], vertexZ[faceA]], norm: [faceA, faceB, faceC] });
  2917. vertices.push({ pos: [vertexX[faceB], vertexY[faceB], vertexZ[faceB]], norm: [faceA, faceB, faceC] });
  2918. vertices.push({ pos: [vertexX[faceC], vertexY[faceC], vertexZ[faceC]], norm: [faceA, faceB, faceC] });
  2919. }
  2920.  
  2921. let positions = [];
  2922. let normals = [];
  2923. for (let vertex of vertices) {
  2924. positions.push(...vertex.pos);
  2925. normals.push(...vertex.norm);
  2926. }
  2927.  
  2928. // console.log(positions);
  2929.  
  2930. cube.geometry.attributes.position.array = new Float32Array(positions);
  2931. cube.geometry.attributes.position.needsUpdate = true;
  2932. }
  2933.  
  2934. this.resetFrames = function() {
  2935. framesReady = false;
  2936. flag = 0;
  2937. frameSet1 = null;
  2938. frameSet2 = null;
  2939. }
  2940.  
  2941. }[/CODE]
  2942.  
  2943. [CODE]var Trig = Trig || {};
  2944.  
  2945. Trig.Trig = function Trig() {
  2946.  
  2947. let SINE = Array(16384);
  2948. let COSINE = Array(16384);
  2949.  
  2950. this.init = function() {
  2951. let step = 3.834951969714103E-4;
  2952.  
  2953. for (let i = 0; i < 16384; i++) {
  2954. SINE[i] = 16384.0 * Math.sin(i * step);
  2955. COSINE[i] = 16384.0 * Math.cos(i * step);
  2956. }
  2957. }
  2958.  
  2959. this.getSine = function(i) {
  2960. return SINE[i];
  2961. }
  2962.  
  2963. this.getCosine = function(i) {
  2964. return COSINE[i];
  2965. }
  2966.  
  2967. this.init();
  2968.  
  2969. }[/CODE]
  2970. [/SPOILER]
  2971.  
  2972. Credits:
  2973. Makar: 727 client for reference
  2974. Countless people on r-s for releasing the model header[/CENTER]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement