antispam-bee domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/ruwritingagame/public_html/wp-includes/functions.php on line 6131\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0438 \u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 – \u043c\u0430\u0448\u0438\u043d\u0430, \u0433\u0434\u0435 \u043a\u043e\u0440\u043f\u0443\u0441 \u0431\u044b\u043b \u0431\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c, \u0430 \u043a\u043e\u043b\u0435\u0441\u0430 – \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c\u0438. \u0414\u043b\u044f \u043e\u0431\u043e\u0438\u0445 (\u043a\u043e\u0440\u043f\u0443\u0441 \u0438 \u043a\u043e\u043b\u0435\u0441\u043e) \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u044b, \u043e\u0431\u0441\u0443\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0438\u0445 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n\n\n\n
1. \u0412 Windows File Explorer<\/strong>-\u0435 \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 (CPP) \u043a\u0430\u0442\u0430\u043b\u043e\u0433, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e a997modeler <\/em>\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u0435\u0435 (\u043a\u043e\u043f\u0438\u044e) \u0432 a996car<\/strong><\/p>\n\n\n\n 2. \u041f\u043e\u0434 C:\\CPP\\a996car\\dt\\models<\/strong><\/em> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 sub-folder <\/p>\n\n\n\n C:\\CPP\\a996car\\dt\\models\\cars\\01<\/strong><\/em><\/p>\n\n\n\n \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0443\u0441\u0442\u044c \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 (\u043a\u043e\u0440\u043f\u0443\u0441 \u0438 \u043a\u043e\u043b\u0435\u0441\u0430) \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u043c\u0438.<\/p>\n\n\n\n <\/p>\n\n\n\n 3. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 Text Editor<\/strong> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432\/\u043a\u0430\u043a<\/p>\n\n\n\n C:\\CPP\\a996car\\dt\\models\\cars\\01\\wheel01.txt<\/strong><\/em><\/p>\n\n\n \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c – \u043a\u043e\u0440\u043f\u0443\u0441 \u0441 \u043f\u0440\u0438\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043b\u0435\u0441\u0430\u043c\u0438.<\/p>\n\n\n\n 4. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 Text Editor<\/strong> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\/\u043a\u0430\u043a<\/p>\n\n\n\n C:\\CPP\\a996car\\dt\\models\\cars\\01\\root01.txt<\/strong><\/em><\/p>\n\n\n \u0422\u0435\u043f\u0435\u0440\u044c – SW \u0447\u0430\u0441\u0442\u044c.<\/p>\n\n\n\n 5. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c VS. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c C:\\CPP\\a996car<\/strong>\\p_windows\\p_windows.sln<\/strong><\/em> solution.<\/p>\n\n\n\n \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 GameSubj<\/strong>:<\/p>\n\n\n\n 6. \u0417\u0430\u043c\u0435\u043d\u0438\u043c GameSubj.h<\/em> \u043a\u043e\u0434 \u044d\u0442\u0438\u043c:<\/p>\n\n\n <\/p>\n\n\n\n \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430:<\/p>\n\n\n\n 7. \u0417\u0430\u043c\u0435\u043d\u0438\u043c GameSubj.cpp<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n <\/p>\n\n\n\n \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e:<\/p>\n\n\n\n \u041a\u043b\u0430\u0441\u0441 Coords <\/strong>\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u043d (\u0443\u043f\u0440\u043e\u0449\u0435\u043d).<\/p>\n\n\n\n 8. \u0417\u0430\u043c\u0435\u043d\u0438\u043c Coords.h<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n 9. \u0417\u0430\u043c\u0435\u043d\u0438\u043c Coords.cpp<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n \u042d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u0438 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 Camera<\/strong>.<\/p>\n\n\n\n 10. \u0417\u0430\u043c\u0435\u043d\u0438\u043c Camera.cpp<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n <\/p>\n\n\n\n \u041d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 CarWheel <\/strong>\u0431\u0443\u0434\u0435\u0442 \u0447\u0430\u0441\u0442\u044c\u044e \u041f\u0440\u043e\u0435\u043a\u0442\u0430<\/strong>, \u0430 \u043d\u0435 \u0434\u0432\u0438\u0436\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e.<\/p>\n\n\n\n 11. \u041f\u043e\u0434 xTheGame<\/em> \u0434\u043e\u0431\u0430\u0432\u0438\u043c New Filter<\/strong>,\u0438\u043c\u044f – car<\/strong><\/p>\n\n\n\n 12. \u041f\u043e\u0434 xTheGame\/car<\/em> \u0434\u043e\u0431\u0430\u0432\u0438\u043c new item – header<\/em> file CarWheel.h<\/strong><\/p>\n\n\n\n \u041c\u0435\u043d\u044f\u0435\u043c location \u043d\u0430 C:\\CPP\\a996car\\car<\/strong><\/em><\/p>\n\n\n\n \u041a\u043e\u0434:<\/p>\n\n\n <\/p>\n\n\n\n \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435:<\/p>\n\n\n\n 13. \u041f\u043e\u0434 xTheGame\/car<\/em> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 C++<\/em> file CarWheel.cpp<\/strong><\/p>\n\n\n\n Location: C:\\CPP\\a996car\\car<\/strong><\/em><\/p>\n\n\n\n \u041a\u043e\u0434:<\/p>\n\n\n <\/p>\n\n\n\n 14. \u0417\u0430\u043c\u0435\u043d\u0438\u043c TheGame.cpp<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n <\/p>\n\n\n\n \u0417\u0430\u043c\u0435\u0442\u0438\u043c:<\/p>\n\n\n\n \u0422\u0435\u043f\u0435\u0440\u044c – \u0447\u0442\u0435\u043d\u0438\u0435\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0430\u0433\u0430element<\/em>:<\/p>\n\n\n\n 15. \u0417\u0430\u043c\u0435\u043d\u0438\u043c ModelLoader.h<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n <\/p>\n\n\n\n 16. \u0417\u0430\u043c\u0435\u043d\u0438\u043c ModelLoader.cpp<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n <\/p>\n\n\n\n \u0417\u0430\u043c\u0435\u0442\u0438\u043c:<\/p>\n\n\n\n \u0414\u043b\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 ModelBuilder <\/em>\u0443 \u043d\u0430\u0441 \u043d\u043e\u0432\u044b\u0439 vector\/stack std::vector usingSubjsStack;<\/em><\/p>\n\n\n\n 17. \u0417\u0430\u043c\u0435\u043d\u0438\u043c ModelBuilder1base.h<\/em> \u043a\u043e\u0434 \u043d\u0430:<\/p>\n\n\n <\/p>\n\n\n\n 18. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a:<\/p>\n\n\n\n <\/p>\n\n\n\n
\n\n\n\n
\n\n\n\n
<\/p>\n\n\n\n\n\/\/wheel\n<mt_type="phong" uColor="#0000ff" \/>\n<vs="box" whl="4,20,20" \/>\n<a="front,back,right,top,bottom" \/>\n<mt_type="phong" uColor="#000000" \/> \/\/inner side\n<a="left" \/>\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n\/\/body\n<mt_type="phong" uColor="#ff0000" \/>\n<vs="box" whl="10,20,70" \/>\n<a="front,back,left,right,top" py=5 \/>\n\/\/wheels\n<element="wheel01.txt" class="CarWheel" pxyz="-10,0,30" ay=180 \/> \/\/front passenger\n<element="wheel01.txt" class="CarWheel" pxyz="10,0,30" \/> \/\/front driver\n<element="wheel01.txt" class="CarWheel" pxyz="-10,0,-20" ay=180 \/> \/\/rear passenger\n<element="wheel01.txt" class="CarWheel" pxyz="10,0,-20" \/> \/\/rear driver\n \n<\/pre><\/div>\n\n\n
\n\n\n\n
\n\n\n\n\n#pragma once\n#include "Coords.h"\n#include "Material.h"\n#include <string>\n#include <vector>\n\nclass GameSubj\n{\npublic:\n\tstd::vector<GameSubj*>* pSubjsSet = NULL; \/\/which vector\/set this subj belongs to\n\tint nInSubjsSet = 0; \/\/subj's number in pSubjsSet\n\tint rootN = 0; \/\/model's root N\n\tint d2parent = 0; \/\/shift to parent object\n\tint d2headTo = 0; \/\/shift to headTo object\n\tint totalElements = 0; \/\/elements N in the model\n\tint totalNativeElements = 0; \/\/elements N in the model when initially loaded\n\tchar source[256] = "";\n\tchar className[32] = "";\n\tCoords absCoords;\n\tmat4x4 absModelMatrixUnscaled = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };\n\tmat4x4 absModelMatrix = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };\n\n\tchar name[32]="";\n\tCoords ownCoords;\n\tCoords ownSpeed;\n\tfloat scale[3] = { 1,1,1 };\n\tint djStartN = 0; \/\/first DJ N in DJs array (DrawJob::drawJobs)\n\tint djTotalN = 0; \/\/number of DJs\n\tmat4x4 ownModelMatrixUnscaled = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };\n\n\tMaterial* pAltMaterial = NULL;\npublic:\n\tvirtual GameSubj* clone() { return new GameSubj(*this); };\n\tvirtual ~GameSubj();\n\tvoid buildModelMatrix() { buildModelMatrix(this); };\n\tstatic void buildModelMatrix(GameSubj* pGS);\n\tvirtual int moveSubj() { return applySpeeds(this); };\n\tstatic int applySpeeds(GameSubj* pGS);\n};\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#include "GameSubj.h"\n#include "platform.h"\n#include "utils.h"\n\nGameSubj::~GameSubj() {\n if (pAltMaterial != NULL)\n delete pAltMaterial;\n}\nvoid GameSubj::buildModelMatrix(GameSubj* pGS) {\n mat4x4_translate(pGS->ownModelMatrixUnscaled, pGS->ownCoords.pos[0], pGS->ownCoords.pos[1], pGS->ownCoords.pos[2]);\n \/\/rotation order: Z-X-Y\n mat4x4_mul(pGS->ownModelMatrixUnscaled, pGS->ownModelMatrixUnscaled, pGS->ownCoords.rotationMatrix);\n\n if(pGS->d2parent == 0)\n memcpy(pGS->absModelMatrixUnscaled, pGS->ownModelMatrixUnscaled, sizeof(mat4x4));\n else {\n GameSubj* pParent = pGS->pSubjsSet->at(pGS->nInSubjsSet - pGS->d2parent);\n mat4x4_mul(pGS->absModelMatrixUnscaled, pParent->absModelMatrixUnscaled, pGS->ownModelMatrixUnscaled);\n }\n if (v3equals(pGS->scale, 1))\n memcpy(pGS->absModelMatrix, pGS->absModelMatrixUnscaled, sizeof(mat4x4));\n else\n mat4x4_scale_aniso(pGS->absModelMatrix, pGS->absModelMatrixUnscaled, pGS->scale[0], pGS->scale[1], pGS->scale[2]);\n\n \/\/update absCoords\n if (pGS->d2parent == 0)\n memcpy(&pGS->absCoords, &pGS->ownCoords, sizeof(Coords));\n else {\n Coords::getPositionFromMatrix(pGS->absCoords.pos, pGS->absModelMatrixUnscaled);\n }\n}\nint GameSubj::applySpeeds(GameSubj* pGS) {\n bool angleChanged = false;\n for(int i=0;i<3;i++)\n if (pGS->ownSpeed.eulerDg[i] != 0) {\n angleChanged = true;\n pGS->ownCoords.eulerDg[i] += pGS->ownSpeed.eulerDg[i];\n if (pGS->ownCoords.eulerDg[i] > 180.0)\n pGS->ownCoords.eulerDg[i] -= 360.0;\n else if (pGS->ownCoords.eulerDg[i] <= -180.0)\n pGS->ownCoords.eulerDg[i] += 360.0;\n }\n if(angleChanged)\n Coords::eulerDgToMatrix(pGS->ownCoords.rotationMatrix, pGS->ownCoords.eulerDg);\n return 1;\n}\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#pragma once\n#include "linmath.h"\n\nclass Coords\n{\npublic:\n\tfloat pos[4] = { 0,0,0,0 }; \/\/x,y,z position + 4-th element for compatibility with 3D 4x4 matrices math\n\tfloat eulerDg[3] = { 0,0,0 }; \/\/Euler angles (pitch, yaw, roll) in degrees\n\tmat4x4 rotationMatrix = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };\npublic:\n\tstatic void getPositionFromMatrix(float* pos, mat4x4 m);\n\tstatic void eulerDgToMatrix(mat4x4 rotationMatrix, float* eulerDg);\n\tstatic void matrixToEulerDg(float* eulerDg, mat4x4 m);\n};\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#include "Coords.h"\n#include "platform.h"\n#include <string>\n\nfloat PI = 3.141592f;\nfloat degrees2radians = PI \/ 180.0f;\nfloat radians2degrees = 180.0f \/ PI;\n\nvoid Coords::getPositionFromMatrix(float* pos, mat4x4 m) {\n\t\/\/extracts position from matrix\n\tfor (int i = 0; i < 3; i++)\n\t\tpos[i] = m[i][3];\n}\nvoid Coords::eulerDgToMatrix(mat4x4 rotationMatrix, float* eulerDg) {\n\t\/\/builds rotation matrix from Euler angles (in degreed)\n\tmat4x4_identity(rotationMatrix);\n\t\/\/rotation order: Z-X-Y\n\tfloat a = eulerDg[1];\n\tif (a != 0)\n\t\tmat4x4_rotate_Y(rotationMatrix, rotationMatrix, a * degrees2radians);\n\ta = eulerDg[0];\n\tif (a != 0)\n\t\tmat4x4_rotate_X(rotationMatrix, rotationMatrix, a * degrees2radians);\n\ta = eulerDg[2];\n\tif (a != 0)\n\t\tmat4x4_rotate_Z(rotationMatrix, rotationMatrix, a * degrees2radians);\n}\nvoid Coords::matrixToEulerDg(float* eulerDg, mat4x4 m) {\n\t\/\/calculates Euler angles (in degrees) from matrix\n\tfloat yaw, pitch, roll; \/\/in redians\n\n\tif (m[1][2] > 0.998 || m[1][2] < -0.998) { \/\/ singularity at south or north pole\n\t\tyaw = atan2f(-m[2][0], m[0][0]);\n\t\troll = 0;\n\t}\n\telse {\n\t\tyaw = atan2f(-m[0][2], m[2][2]);\n\t\troll = atan2f(-m[1][0], m[1][1]);\n\t}\n\tpitch = asinf(m[1][2]);\n\n\teulerDg[0] = pitch * radians2degrees;\n\teulerDg[1] = yaw * radians2degrees;\n\teulerDg[2] = roll * radians2degrees;\n}\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#include "Camera.h"\n#include "TheGame.h"\n#include "utils.h"\n\nextern TheGame theGame;\nextern float degrees2radians;\n\nfloat Camera::pickDistance(Camera* pCam) {\n\tfloat cotangentA = 1.0f \/ tanf(degrees2radians * pCam->viewRangeDg \/ 2);\n\tfloat cameraDistanceV = pCam->stageSize[1] \/ 2 * cotangentA;\n\tfloat cameraDistanceH = pCam->stageSize[0] \/ 2 * cotangentA \/ theGame.screenAspectRatio;\n\tpCam->focusDistance = fmax(cameraDistanceV, cameraDistanceH);\n\treturn pCam->focusDistance;\n}\nvoid Camera::setCameraPosition(Camera* pCam) {\n\tv3set(pCam->ownCoords.pos, 0, 0, -pCam->focusDistance);\n\tmat4x4_mul_vec4plus(pCam->ownCoords.pos, pCam->ownCoords.rotationMatrix, pCam->ownCoords.pos, 1);\n\tfor (int i = 0; i < 3; i++)\n\t\tpCam->ownCoords.pos[i] += pCam->lookAtPoint[i];\n}\nvoid Camera::buildLookAtMatrix(Camera* pCam) {\n\tfloat cameraUp[4] = { 0,1,0,0 }; \/\/y - up\n\tmat4x4_mul_vec4plus(cameraUp, pCam->ownCoords.rotationMatrix, cameraUp, 0);\n\tmat4x4_look_at(pCam->lookAtMatrix, pCam->ownCoords.pos, pCam->lookAtPoint, cameraUp);\n}\nvoid Camera::onScreenResize(Camera* pCam) {\n\tpickDistance(pCam);\n\tsetCameraPosition(pCam);\n\tbuildLookAtMatrix(pCam);\n}\n\n<\/pre><\/div>\n\n\n
\n\n\n\n
\n\n\n\n\n#pragma once\n#include "GameSubj.h"\n\nclass CarWheel : public GameSubj\n{\npublic:\n\tfloat wheelDiameter = 20;\npublic:\n\tvirtual GameSubj* clone() { return new CarWheel(*this); };\n\tvirtual int moveSubj() { return moveSubj(this); };\n\tstatic int moveSubj(CarWheel* pGS);\n};\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#include "CarWheel.h"\n\nint CarWheel::moveSubj(CarWheel* pGS) {\n float wheelRotationSpeedDg = 3;\n if (abs(pGS->ownCoords.eulerDg[1]) > 90)\n wheelRotationSpeedDg = -wheelRotationSpeedDg;\n pGS->ownSpeed.eulerDg[0] = wheelRotationSpeedDg;\n applySpeeds(pGS);\n return 1;\n}\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#include "TheGame.h"\n#include "platform.h"\n#include "utils.h"\n#include "linmath.h"\n#include "Texture.h"\n#include "Shader.h"\n#include "DrawJob.h"\n#include "ModelBuilder.h"\n#include "TexCoords.h"\n#include "ModelLoader.h"\n#include "car\/CarWheel.h"\n\nextern std::string filesRoot;\nextern float degrees2radians;\n\nstd::vector<GameSubj*> TheGame::gameSubjs;\n\nint TheGame::getReady() {\n bExitGame = false;\n Shader::loadShaders();\n glEnable(GL_CULL_FACE);\n\n glEnable(GL_DEPTH_TEST);\n glDepthFunc(GL_LEQUAL);\n glDepthMask(GL_TRUE);\n\n int subjN = ModelLoader::loadModel(&gameSubjs, "\/dt\/models\/cars\/01\/root01.txt", "");\n GameSubj* pGS = gameSubjs.at(subjN);\n pGS->ownSpeed.eulerDg[1] = 1;\n\n \/\/===== set up camera\n v3set(mainCamera.ownCoords.eulerDg, 15, 180, 0); \/\/set camera angles\/orientation\n Coords::eulerDgToMatrix(mainCamera.ownCoords.rotationMatrix, mainCamera.ownCoords.eulerDg);\n\n mainCamera.viewRangeDg = 20;\n mainCamera.stageSize[0] = 90;\n mainCamera.stageSize[1] = 60;\n memcpy(mainCamera.lookAtPoint, pGS->ownCoords.pos, sizeof(float) * 3);\n mainCamera.onScreenResize();\n\n \/\/===== set up light\n v3set(dirToMainLight, -1, 1, 1);\n vec3_norm(dirToMainLight, dirToMainLight);\n\n return 1;\n}\nint TheGame::drawFrame() {\n myPollEvents(); \n\n \/\/glClearColor(0.0, 0.0, 0.5, 1.0);\n glDepthMask(GL_TRUE);\n glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n mat4x4 mProjection, mViewProjection, mMVP, mMV4x4;\n \/\/mat4x4_ortho(mProjection, -(float)screenSize[0] \/ 2, (float)screenSize[0] \/ 2, -(float)screenSize[1] \/ 2, (float)screenSize[1] \/ 2, 100.f, 500.f);\n float nearClip = mainCamera.focusDistance - 55;\n float farClip = mainCamera.focusDistance + 55;\n if (nearClip < 0) nearClip = 0;\n mat4x4_perspective(mProjection, mainCamera.viewRangeDg * degrees2radians, screenAspectRatio, nearClip, farClip);\n mat4x4_mul(mViewProjection, mProjection, mainCamera.lookAtMatrix);\n mViewProjection[1][3] = 0; \/\/keystone effect\n\n \/\/scan subjects\n int subjsN = gameSubjs.size();\n for (int subjN = 0; subjN < subjsN; subjN++) {\n GameSubj* pGS = gameSubjs.at(subjN);\n \/\/behavior - apply rotation speed\n pGS->moveSubj();\n \/\/prepare subject for rendering\n pGS->buildModelMatrix(pGS);\n \/\/build MVP matrix for given subject\n mat4x4_mul(mMVP, mViewProjection, pGS->absModelMatrix);\n \/\/build Model-View (rotation) matrix for normals\n mat4x4_mul(mMV4x4, mainCamera.lookAtMatrix, pGS->absModelMatrixUnscaled);\n \/\/convert to 3x3 matrix\n float mMV3x3[3][3];\n for (int y = 0; y < 3; y++)\n for (int x = 0; x < 3; x++)\n mMV3x3[y][x] = mMV4x4[y][x];\n \/\/subj's distance from camera\n float cameraSpacePos[4];\n mat4x4_mul_vec4plus(cameraSpacePos, mainCamera.lookAtMatrix, pGS->absCoords.pos, 1);\n float zDistance = abs(cameraSpacePos[2]);\n float cotangentA = 1.0f \/ tanf(degrees2radians * mainCamera.viewRangeDg \/ 2.0f);\n float halfScreenVertSizeInUnits = zDistance \/ cotangentA;\n float sizeUnitPixelsSize = (float)screenSize[1] \/ 2.0f \/ halfScreenVertSizeInUnits;\n \/\/render subject\n for (int i = 0; i < pGS->djTotalN; i++) {\n DrawJob* pDJ = DrawJob::drawJobs.at(pGS->djStartN + i);\n pDJ->execute((float*)mMVP, *mMV3x3, (float*)pGS->absModelMatrix, dirToMainLight, mainCamera.ownCoords.pos, sizeUnitPixelsSize, NULL);\n }\n }\n \/\/synchronization\n while (1) {\n long long int currentMillis = getSystemMillis();\n long long int millisSinceLastFrame = currentMillis - lastFrameMillis;\n if (millisSinceLastFrame >= millisPerFrame) {\n lastFrameMillis = currentMillis;\n break;\n }\n }\n mySwapBuffers();\n return 1;\n}\nint TheGame::cleanUp() {\n int itemsN = gameSubjs.size();\n \/\/delete all UISubjs\n for (int i = 0; i < itemsN; i++) {\n GameSubj* pGS = gameSubjs.at(i);\n delete pGS;\n }\n gameSubjs.clear();\n \/\/clear all other classes\n Texture::cleanUp();\n Shader::cleanUp();\n DrawJob::cleanUp();\n return 1;\n}\nint TheGame::onScreenResize(int width, int height) {\n if (screenSize[0] == width && screenSize[1] == height)\n return 0;\n screenSize[0] = width;\n screenSize[1] = height;\n screenAspectRatio = (float)width \/ height;\n glViewport(0, 0, width, height);\n mainCamera.onScreenResize();\n mylog(" screen size %d x %d\\n", width, height);\n return 1;\n}\nint TheGame::run() {\n getReady();\n while (!bExitGame) {\n drawFrame();\n }\n cleanUp();\n return 1;\n}\nGameSubj* TheGame::newGameSubj(std::string subjClass) {\n GameSubj* pGS = NULL;\n if (subjClass.compare("") == 0)\n pGS = (new GameSubj());\n else if (subjClass.find("Car") == 0) {\n if (subjClass.compare("CarWheel") == 0)\n pGS = (new CarWheel());\n }\n if(pGS == NULL) {\n mylog("ERROR in TheGame::newGameSubj. %s class not found\\n", subjClass.c_str());\n return NULL;\n }\n myStrcpy_s(pGS->className, 32, subjClass.c_str());\n return pGS;\n}\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#pragma once\n#include "XMLparser.h"\n#include "ModelBuilder.h"\n#include "GroupTransform.h"\n#include "MaterialAdjust.h"\n\nclass ModelLoader : public XMLparser\n{\npublic:\n\tModelBuilder* pModelBuilder = NULL;\n\tbool ownModelBuilder = false;\n\tstd::vector<GameSubj*>* pSubjsVector = NULL;\n\tMaterialAdjust* pMaterialAdjust = NULL;\n\tint lineStartsAt = -1;\npublic:\n\tModelLoader(std::vector<GameSubj*>* pSubjsVector0, int subjN, ModelBuilder* pMB, std::string filePath) : XMLparser(filePath) {\n\t\tpSubjsVector = pSubjsVector0;\n\t\tif (pMB != NULL) {\n\t\t\townModelBuilder = false;\n\t\t\tpModelBuilder = pMB;\n\t\t}\n\t\telse {\n\t\t\townModelBuilder = true;\n\t\t\tpModelBuilder = new ModelBuilder();\n\t\t\tpModelBuilder->lockGroup(pModelBuilder);\n\t\t}\n\t\tpModelBuilder->useSubjN(pModelBuilder,subjN);\n\t};\n\tvirtual ~ModelLoader() {\n\t\tif (!ownModelBuilder)\n\t\t\treturn;\n\t\tpModelBuilder->buildDrawJobs(pModelBuilder, pSubjsVector);\n\t\tdelete pModelBuilder;\n\t};\n\tstatic int processTag_a(ModelLoader* pML); \/\/apply\n\tstatic int setValueFromIntHashMap(int* pInt, std::map<std::string, int> intHashMap, std::string varName, std::string tagStr);\n\tstatic int setTexture(ModelLoader* pML, int* pInt, std::string txName);\n\tstatic int setMaterialTextures(ModelLoader* pML, Material* pMT);\n\tstatic int fillProps_vs(VirtualShape* pVS, std::string tagStr); \/\/virtual shape\n\tstatic int fillProps_mt(Material* pMT, std::string tagStr, ModelLoader* pML); \/\/Material\n\tstatic int fillProps_gt(GroupTransform* pGS, ModelBuilder* pMB, std::string tagStr);\n\tvirtual int processTag() { return processTag(this); };\n\tstatic int processTag(ModelLoader* pML);\n\tstatic int loadModel(std::vector<GameSubj*>* pSubjsVector0, std::string sourceFile, std::string subjClass);\n\tstatic int processTag_clone(ModelLoader* pML);\n\tstatic int addMark(char* marks, std::string newMark);\n\tstatic int processTag_do(ModelLoader* pML);\n\tstatic int processTag_a2mesh(ModelLoader* pML);\n\tstatic int processTag_element(ModelLoader* pML);\n};\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#include "ModelLoader.h"\n#include "platform.h"\n#include "TheGame.h"\n#include "DrawJob.h"\n#include "Texture.h"\n#include "utils.h"\n#include "Polygon.h"\n\nextern TheGame theGame; \n\nint ModelLoader::loadModel(std::vector<GameSubj*>* pSubjsVector0, std::string sourceFile, std::string subjClass) {\n\t\/\/returns element's (Subj) number or -1\n\t\/\/first - check if already loaded\n\tint totalSubjs = pSubjsVector0->size();\n\tfor (int subjN0 = totalSubjs - 1; subjN0 >= 0; subjN0--) {\n\t\tGameSubj* pGS0 = pSubjsVector0->at(subjN0);\n\t\tif (pGS0 == NULL)\n\t\t\tcontinue;\n\t\tif (strcmp(pGS0->source, sourceFile.c_str()) != 0)\n\t\t\tcontinue;\n\t\t\/\/if here - model was already loaded - copy\n\t\tint subjN = pSubjsVector0->size();\n\t\tfor (int i = 0; i < pGS0->totalNativeElements; i++) {\n\t\t\tGameSubj* pGS = pSubjsVector0->at(subjN0 + i)->clone();\n\t\t\tpGS->nInSubjsSet = pSubjsVector0->size();\n\t\t\tpSubjsVector0->push_back(pGS);\n\t\t}\n\t\tGameSubj* pGS = pSubjsVector0->at(subjN);\n\t\tpGS->totalElements = pGS->totalNativeElements;\n\t\tpGS->d2parent = 0;\n\t\tpGS->d2headTo = 0;\n\t\t\/\/restore original 1st DrawJob\n\t\treturn subjN;\n\t}\n\t\/\/if here - model wasn't loaded before - load\n\tint subjN = pSubjsVector0->size();\n\tGameSubj* pGS = theGame.newGameSubj(subjClass);\n\tpGS->pSubjsSet = pSubjsVector0;\n\tpGS->nInSubjsSet = subjN;\n\tmyStrcpy_s(pGS->source, 256, sourceFile.c_str());\n\tpSubjsVector0->push_back(pGS);\n\tModelLoader* pML = new ModelLoader(pSubjsVector0, subjN, NULL, sourceFile);\n\tprocessSource(pML);\n\tdelete pML;\n\tpGS->totalNativeElements = pSubjsVector0->size() - subjN;\n\tpGS->totalElements = pGS->totalNativeElements;\n\treturn subjN;\n}\n\nint ModelLoader::setValueFromIntHashMap(int* pInt, std::map<std::string, int> intHashMap, std::string varName, std::string tagStr) {\n\tif (!varExists(varName, tagStr))\n\t\treturn 0;\n\tstd::string str0 = getStringValue(varName, tagStr);\n\tif (intHashMap.find(str0) == intHashMap.end()) {\n\t\tmylog("ERROR in ModelLoader::setValueFromIntMap, %s not found, %s\\n", varName.c_str(), tagStr.c_str());\n\t\treturn -1;\n\t}\n\t*pInt = intHashMap[getStringValue(varName, tagStr)];\n\treturn 1;\n}\nint ModelLoader::setTexture(ModelLoader* pML, int* pInt, std::string txName) {\n\tModelBuilder* pMB = pML->pModelBuilder;\n\tbool resetTexture = false;\n\tstd::string varName = txName + "_use";\n\tif (varExists(varName, pML->currentTag)) {\n\t\tif (setValueFromIntHashMap(pInt, pMB->texturesHashMap, varName, pML->currentTag) == 0) {\n\t\t\tmylog("ERROR in ModelLoader::setTexture: texture not in hashMap: %s\\n", pML->currentTag.c_str());\n\t\t\treturn -1;\n\t\t}\n\t\tresetTexture = true;\n\t}\n\telse{\n\t\tvarName = txName + "_src";\n\t\tif (varExists(varName, pML->currentTag)) {\n\t\t\tstd::string txFile = getStringValue(varName, pML->currentTag);\n\t\t\tvarName = txName + "_ckey";\n\t\t\tunsigned int intCkey = 0;\n\t\t\tsetUintColorValue(&intCkey, varName, pML->currentTag);\n\t\t\t*pInt = Texture::loadTexture(buildFullPath(pML, txFile), intCkey);\n\t\t\tresetTexture = true;\n\t\t}\n\t}\n\tif(resetTexture)\n\t\treturn 1;\n\treturn 0; \/\/texture wasn't reset\n}\nint ModelLoader::setMaterialTextures(ModelLoader* pML, Material* pMT) {\n\tif (setTexture(pML, &pMT->uTex0, "uTex0") > 0)\n\t\tpMT->uColor.clear();\n\tsetTexture(pML, &pMT->uTex1mask, "uTex1mask");\n\tsetTexture(pML, &pMT->uTex2nm, "uTex2nm");\n\tsetTexture(pML, &pMT->uTex3, "uTex3");\n\treturn 1;\n}\nint ModelLoader::fillProps_mt(Material* pMT, std::string tagStr, ModelLoader* pML) {\n\tsetCharsValue(pMT->shaderType, 20, "mt_type", tagStr);\n\tsetMaterialTextures(pML, pMT);\n\t\/\/color\n\tif (varExists("uColor", tagStr)) {\n\t\tunsigned int uintColor = 0;\n\t\tsetUintColorValue(&uintColor, "uColor", tagStr);\n\t\tpMT->uColor.setUint32(uintColor);\n\t\tpMT->uTex0 = -1;\n\t}\n\t\/\/mylog("mt.uTex0=%d, mt.uTex1mask=%d\\n", mt.uTex0, mt.uTex1mask);\n\tif (varExists("primitiveType", tagStr)) {\n\t\tstd::string str0 = getStringValue("primitiveType", tagStr);\n\t\tif (str0.compare("GL_POINTS") == 0) pMT->primitiveType = GL_POINTS;\n\t\telse if (str0.compare("GL_LINES") == 0) pMT->primitiveType = GL_LINES;\n\t\telse if (str0.compare("GL_LINE_STRIP") == 0) pMT->primitiveType = GL_LINE_STRIP;\n\t\telse if (str0.compare("GL_LINE_LOOP") == 0) pMT->primitiveType = GL_LINE_LOOP;\n\t\telse if (str0.compare("GL_TRIANGLE_STRIP") == 0) pMT->primitiveType = GL_TRIANGLE_STRIP;\n\t\telse if (str0.compare("GL_TRIANGLE_FAN") == 0) pMT->primitiveType = GL_TRIANGLE_FAN;\n\t\telse pMT->primitiveType = GL_TRIANGLES;\n\t}\n\tsetIntValue(&pMT->uTex1alphaChannelN, "uTex1alphaChannelN", tagStr);\n\tsetIntValue(&pMT->uTex0translateChannelN, "uTex0translateChannelN", tagStr);\n\tsetFloatValue(&pMT->uAlphaFactor, "uAlphaFactor", tagStr);\n\tif (pMT->uAlphaFactor < 1)\n\t\tpMT->uAlphaBlending = 1;\n\tsetIntBoolValue(&pMT->uAlphaBlending, "uAlphaBlending", tagStr);\n\tif (pMT->uAlphaBlending > 0)\n\t\tpMT->zBufferUpdate = 0;\n\tsetFloatValue(&pMT->uAmbient, "uAmbient", tagStr);\n\tsetFloatValue(&pMT->uSpecularIntencity, "uSpecularIntencity", tagStr);\n\tsetFloatValue(&pMT->uSpecularMinDot, "uSpecularMinDot", tagStr);\n\tsetFloatValue(&pMT->uSpecularPowerOf, "uSpecularPowerOf", tagStr);\n\n\tsetFloatValue(&pMT->lineWidth, "lineWidth", tagStr);\n\tsetIntBoolValue(&pMT->zBuffer, "zBuffer", tagStr);\n\tif (pMT->zBuffer < 1)\n\t\tpMT->zBufferUpdate = 0;\n\tsetIntBoolValue(&pMT->zBufferUpdate, "zBufferUpdate", tagStr);\n\n\treturn 1;\n}\nint ModelLoader::processTag(ModelLoader* pML) {\n\tModelBuilder* pMB = pML->pModelBuilder;\n\tif (pML->tagName.compare("element") == 0)\n\t\treturn processTag_element(pML);\n\tif (pML->tagName.compare("\/element") == 0) {\n\t\t\/\/restore previous useSubjN from stack\n\t\tint subjN = pMB->usingSubjsStack.back();\n\t\tpMB->usingSubjsStack.pop_back();\n\t\tpMB->useSubjN(pMB, subjN);\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("texture_as") == 0) {\n\t\t\/\/saves texture N in texturesMap under given name\n\t\tstd::string keyName = getStringValue("texture_as", pML->currentTag);\n\t\tif (pMB->texturesHashMap.find(keyName) != pMB->texturesHashMap.end())\n\t\t\treturn pMB->texturesHashMap[keyName];\n\t\telse { \/\/add new\n\t\t\tstd::string txFile = getStringValue("src", pML->currentTag);\n\t\t\tunsigned int intCkey = 0;\n\t\t\tsetUintColorValue(&intCkey, "ckey", pML->currentTag);\n\t\t\tint txN = Texture::loadTexture(buildFullPath(pML, txFile), intCkey);\n\t\t\tpMB->texturesHashMap[keyName] = txN;\n\t\t\t\/\/mylog("%s=%d\\n", keyName.c_str(), pMB->texturesMap[keyName]);\n\t\t\treturn txN;\n\t\t}\n\t}\n\tif (pML->tagName.compare("mt_type") == 0) {\n\t\t\/\/sets current material\n\t\tModelBuilder* pMB = pML->pModelBuilder;\n\t\tif (!pML->closedTag) {\n\t\t\t\/\/save previous material in stack\n\t\t\tif (pMB->usingMaterialN >= 0)\n\t\t\t\tpMB->materialsStack.push_back(pMB->usingMaterialN);\n\t\t}\n\t\tMaterial mt;\n\t\tfillProps_mt(&mt, pML->currentTag, pML);\n\t\tpMB->usingMaterialN = pMB->getMaterialN(pMB, &mt);\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("\/mt_type") == 0) {\n\t\t\/\/restore previous material\n\t\tif (pMB->materialsStack.size() > 0) {\n\t\t\tpMB->usingMaterialN = pMB->materialsStack.back();\n\t\t\tpMB->materialsStack.pop_back();\n\t\t}\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("vs") == 0) {\n\t\t\/\/sets virtual shape\n\t\tModelBuilder* pMB = pML->pModelBuilder;\n\t\tif (pML->closedTag) {\n\t\t\tif (pMB->pCurrentVShape != NULL)\n\t\t\t\tdelete pMB->pCurrentVShape;\n\t\t}\n\t\telse { \/\/open tag\n\t\t\t\/\/save previous vshape in stack\n\t\t\tif (pMB->pCurrentVShape != NULL)\n\t\t\t\tpMB->vShapesStack.push_back(pMB->pCurrentVShape);\n\t\t}\n\t\tpMB->pCurrentVShape = new VirtualShape();\n\t\tfillProps_vs(pMB->pCurrentVShape, pML->currentTag);\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("\/vs") == 0) {\n\t\t\/\/restore previous virtual shape\n\t\tif (pMB->vShapesStack.size() > 0) {\n\t\t\tif (pMB->pCurrentVShape != NULL)\n\t\t\t\tdelete(pMB->pCurrentVShape);\n\t\t\tpMB->pCurrentVShape = pMB->vShapesStack.back();\n\t\t\tpMB->vShapesStack.pop_back();\n\t\t}\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("group") == 0) {\n\t\tstd::string notAllowed[] = { "pxyz","axyz","align","headTo" };\n\t\tint notAllowedLn = sizeof(notAllowed) \/ sizeof(notAllowed[0]);\n\t\tfor (int i = 0; i < notAllowedLn; i++)\n\t\t\tif (varExists(notAllowed[i], pML->currentTag)) {\n\t\t\t\tmylog("ERROR in ModelLoader::processTag: use %s in <\/group>: %s\\n", notAllowed[i].c_str(), pML->currentTag.c_str());\n\t\t\t\treturn -1;\n\t\t\t}\n\t\tpMB->lockGroup(pMB);\n\t\t\/\/mark\n\t\tif (varExists("mark", pML->currentTag))\n\t\t\taddMark(pMB->pCurrentGroup->marks, getStringValue("mark", pML->currentTag));\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("\/group") == 0) {\n\t\tGroupTransform gt;\n\t\tfillProps_gt(>, pMB, pML->currentTag);\n\t\tgt.executeGroupTransform(pMB);\n\n\t\tpMB->releaseGroup(pMB);\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("a") == 0)\n\t\treturn processTag_a(pML); \/\/apply \n\tif (pML->tagName.compare("clone") == 0)\n\t\treturn processTag_clone(pML);\n\tif (pML->tagName.compare("\/clone") == 0)\n\t\treturn processTag_clone(pML);\n\tif (pML->tagName.compare("do") == 0)\n\t\treturn processTag_do(pML);\n\tif (pML->tagName.compare("a2mesh") == 0)\n\t\treturn processTag_a2mesh(pML);\n\tif (pML->tagName.compare("mt_adjust") == 0) {\n\t\tif (pML->pMaterialAdjust != NULL)\n\t\t\tmylog("ERROR in ModelLoader::processTag %s, pMaterialAdjust is still busy. File: %s\\n", pML->currentTag.c_str(), pML->fullPath.c_str());\n\t\tpML->pMaterialAdjust = new (MaterialAdjust);\n\t\tfillProps_mt(pML->pMaterialAdjust, pML->currentTag, pML);\n\t\tpML->pMaterialAdjust->setWhat2adjust(pML->pMaterialAdjust, pML->currentTag);\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("\/mt_adjust") == 0) {\n\t\tif (pML->pMaterialAdjust != NULL) {\n\t\t\tdelete pML->pMaterialAdjust;\n\t\t\tpML->pMaterialAdjust = NULL;\n\t\t}\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("line") == 0) {\n\t\tMaterial mt;\n\t\t\/\/save previous material in stack\n\t\tif (pMB->usingMaterialN >= 0){\n\t\t\tpMB->materialsStack.push_back(pMB->usingMaterialN);\n\t\t\tmemcpy(&mt, pMB->materialsList.at(pMB->usingMaterialN),sizeof(Material));\n\t\t}\n\t\tmt.primitiveType = GL_LINE_STRIP;\n\t\tfillProps_mt(&mt, pML->currentTag, pML);\n\t\tpMB->usingMaterialN = pMB->getMaterialN(pMB, &mt);\n\t\t\/\/line starts\n\t\tpML->lineStartsAt = pMB->vertices.size();\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("\/line") == 0) {\n\t\tpMB->vertices.back()->endOfSequence = 1;\n\t\tpML->lineStartsAt = -1;\n\t\t\/\/restore previous material\n\t\tif (pMB->materialsStack.size() > 0) {\n\t\t\tpMB->usingMaterialN = pMB->materialsStack.back();\n\t\t\tpMB->materialsStack.pop_back();\n\t\t}\n\t\treturn 1;\n\t}\n\tif (pML->tagName.compare("p") == 0) {\n\t\t\/\/line point\n\t\tVertex01* pV = new Vertex01();\n\t\tif (pMB->vertices.size() > pML->lineStartsAt)\n\t\t\tmemcpy(pV, pMB->vertices.back(), sizeof(Vertex01));\n\t\tpV->subjN = pMB->usingSubjN;\n\t\tpV->materialN = pMB->usingMaterialN;\n\t\tsetFloatArray(pV->aPos, 3, "pxyz", pML->currentTag);\n\t\tsetFloatValue(&pV->aPos[0], "px", pML->currentTag);\n\t\tsetFloatValue(&pV->aPos[1], "py", pML->currentTag);\n\t\tsetFloatValue(&pV->aPos[2], "pz", pML->currentTag);\n\t\tfloat dPos[3] = { 0,0,0 };\n\t\tsetFloatArray(dPos, 3, "dxyz", pML->currentTag);\n\t\tsetFloatValue(&dPos[0], "dx", pML->currentTag);\n\t\tsetFloatValue(&dPos[1], "dy", pML->currentTag);\n\t\tsetFloatValue(&dPos[2], "dz", pML->currentTag);\n\t\tif (!v3equals(dPos, 0))\n\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\tpV->aPos[i] += dPos[i];\n\t\tpMB->vertices.push_back(pV);\n\t\treturn 1;\n\t}\n\tmylog("ERROR in ModelLoader::processTag, unhandled tag %s, file %s\\n", pML->currentTag.c_str(), pML->fullPath.c_str());\n\t\/\/mylog("======File:\\n%s----------\\n", pML->pData);\n\treturn -1;\n}\n\nint ModelLoader::fillProps_vs(VirtualShape* pVS, std::string tagStr) {\n\t\/\/sets virtual shape\n\tsetCharsValue(pVS->shapeType, 20, "vs", tagStr);\n\tsetFloatArray(pVS->whl, 3, "whl", tagStr);\n\t\/\/extensions\n\tfloat ext;\n\tif (varExists("ext", tagStr)) {\n\t\tsetFloatValue(&ext, "ext", tagStr);\n\t\tpVS->setExt(ext);\n\t}\n\tif (varExists("extX", tagStr)) {\n\t\tsetFloatValue(&ext, "extX", tagStr);\n\t\tpVS->setExtX(ext);\n\t}\n\tif (varExists("extY", tagStr)) {\n\t\tsetFloatValue(&ext, "extY", tagStr);\n\t\tpVS->setExtY(ext);\n\t}\n\tif (varExists("extZ", tagStr)) {\n\t\tsetFloatValue(&ext, "extZ", tagStr);\n\t\tpVS->setExtZ(ext);\n\t}\n\tsetFloatValue(&pVS->extU, "extU", tagStr);\n\tsetFloatValue(&pVS->extD, "extD", tagStr);\n\tsetFloatValue(&pVS->extL, "extL", tagStr);\n\tsetFloatValue(&pVS->extR, "extR", tagStr);\n\tsetFloatValue(&pVS->extF, "extF", tagStr);\n\tsetFloatValue(&pVS->extB, "extB", tagStr);\n\t\/\/sections\n\tsetIntValue(&pVS->sectionsR, "sectR", tagStr);\n\tsetIntValue(&pVS->sections[0], "sectX", tagStr);\n\tsetIntValue(&pVS->sections[1], "sectY", tagStr);\n\tsetIntValue(&pVS->sections[2], "sectZ", tagStr);\n\n\t\/\/mylog("pVS->shapeType=%s whl=%fx%fx%f\\n", pVS->shapeType, pVS->whl[0], pVS->whl[1], pVS->whl[2]);\n\treturn 1;\n}\nint ModelLoader::processTag_a(ModelLoader* pML) {\n\t\/\/apply\n\tModelBuilder* pMB = pML->pModelBuilder;\n\tstd::string tagStr = pML->currentTag;\n\tpMB->lockGroup(pMB);\n\t\/\/mark\n\tif (varExists("mark", tagStr))\n\t\taddMark(pMB->pCurrentGroup->marks, getStringValue("mark", tagStr));\n\n\tstd::vector<std::string> applyTosVector = splitString(pML->getStringValue("a", tagStr), ",");\n\tMaterial* pMT = pMB->materialsList.at(pMB->usingMaterialN);\n\tint texN = pMT->uTex1mask;\n\tif (texN < 0)\n\t\ttexN = pMT->uTex0;\n\tfloat xywh[4] = { 0,0,1,1 };\n\tTexCoords* pTC = NULL;\n\tif (varExists("xywh", tagStr)) {\n\t\tsetFloatArray(xywh, 4, "xywh", tagStr);\n\t\tstd::string flipStr = getStringValue("flip", tagStr);\n\t\tTexCoords tc;\n\t\ttc.set(texN, xywh[0], xywh[1], xywh[2], xywh[3], flipStr);\n\t\tpTC = &tc;\n\t}\n\tTexCoords* pTC2nm = NULL;\n\tif (varExists("xywh2nm", tagStr)) {\n\t\tsetFloatArray(xywh, 4, "xywh2nm", tagStr);\n\t\tstd::string flipStr = getStringValue("flip2nm", tagStr);\n\t\tTexCoords tc2nm;\n\t\ttc2nm.set(pMT->uTex2nm, xywh[0], xywh[1], xywh[2], xywh[3], flipStr);\n\t\tpTC2nm = &tc2nm;\n\t}\n\t\/\/adjusted VirtualShape\n\tVirtualShape* pVS_a = new VirtualShape(*pMB->pCurrentVShape);\n\tfillProps_vs(pVS_a, tagStr);\n\n\tfor (int aN = 0; aN < (int)applyTosVector.size(); aN++) {\n\t\tpMB->buildFace(pMB, applyTosVector.at(aN), pVS_a, pTC, pTC2nm);\n\t}\n\tdelete pVS_a;\n\t\/\/mylog("vertsN=%d\\n",pMB->vertices.size());\n\n\tGroupTransform GT_a;\n\tfillProps_gt(>_a, pMB, tagStr);\n\tGT_a.executeGroupTransform(pMB);\n\n\tpMB->releaseGroup(pMB);\n\treturn 1;\n}\nint ModelLoader::processTag_clone(ModelLoader* pML) {\n\tModelBuilder* pMB = pML->pModelBuilder;\n\tif (pML->tagName.compare("clone") == 0) {\n\t\t\/\/mark what to clone\n\t\tGroupTransform gt;\n\t\tgt.pGroup = pMB->pLastClosedGroup;\n\t\tgt.flagSelection(>, &pMB->vertices, &pMB->triangles);\n\n\t\t\/\/cloning\n\t\tpMB->lockGroup(pMB);\n\t\tgt.cloneFlagged(pMB, &pMB->vertices, &pMB->triangles, &pMB->vertices, &pMB->triangles);\n\t}\n\tGroupTransform gt;\n\tfillProps_gt(>, pMB, pML->currentTag);\n\tgt.executeGroupTransform(pMB);\n\n\tif (pML->tagName.compare("\/clone") == 0 || pML->closedTag) {\n\t\tpMB->releaseGroup(pMB);\n\t}\n\treturn 1;\n}\nint ModelLoader::addMark(char* marks, std::string newMark) {\n\tif (newMark.empty())\n\t\treturn 0;\n\tstd::string allMarks;\n\tallMarks.assign(marks);\n\tallMarks.append("<" + newMark + ">");\n\tmyStrcpy_s(marks, 124, allMarks.c_str());\n\treturn 1;\n}\nint ModelLoader::fillProps_gt(GroupTransform* pGT, ModelBuilder* pMB, std::string tagStr) {\n\tpGT->pGroup = pMB->pCurrentGroup;\n\t\/\/position\n\tsetFloatArray(pGT->shift, 3, "pxyz", tagStr);\n\tsetFloatValue(&pGT->shift[0], "px", tagStr);\n\tsetFloatValue(&pGT->shift[1], "py", tagStr);\n\tsetFloatValue(&pGT->shift[2], "pz", tagStr);\n\t\/\/angles\n\tsetFloatArray(pGT->spin, 3, "axyz", tagStr);\n\tsetFloatValue(&pGT->spin[0], "ax", tagStr);\n\tsetFloatValue(&pGT->spin[1], "ay", tagStr);\n\tsetFloatValue(&pGT->spin[2], "az", tagStr);\n\t\/\/scale\n\tsetFloatArray(pGT->scale, 3, "scale", tagStr);\n\n\tpGT->onThe = getStringValue("onThe", tagStr);\n\tpGT->allign = getStringValue("allign", tagStr);\n\tpGT->headZto = getStringValue("headZto", tagStr);\n\t\/\/limit to\n\tif (varExists("all", tagStr))\n\t\tpGT->pGroup = NULL;\n\tif (varExists("lastClosedGroup", tagStr))\n\t\tpGT->pGroup = pMB->pLastClosedGroup;\n\tif (varExists("markedAs", tagStr))\n\t\tpGT->limit2mark(pGT, getStringValue("markedAs", tagStr));\n\tsetFloatArray(pGT->pMin, 3, "xyzMin", tagStr);\n\tsetFloatArray(pGT->pMax, 3, "xyzMax", tagStr);\n\n\tif (varExists("sizeD", tagStr)) { \/\/re-size\n\t\tfloat sizeD[3];\n\t\tsetFloatArray(sizeD, 3, "sizeD", tagStr);\n\t\t\/\/bounding box\n\t\tpGT->flagSelection(pGT, &pMB->vertices, NULL);\n\t\tfloat bbMin[3];\n\t\tfloat bbMax[3];\n\t\tpGT->buildBoundingBoxFlagged(bbMin, bbMax, &pMB->vertices);\n\t\tfor (int i = 0; i < 3; i++) {\n\t\t\tfloat size = bbMax[i] - bbMin[i];\n\t\t\tpGT->scale[i] = (size + sizeD[i]) \/ size;\n\t\t}\n\t}\n\treturn 1;\n}\nint ModelLoader::processTag_do(ModelLoader* pML) {\n\tModelBuilder* pMB = pML->pModelBuilder;\n\tGroupTransform gt;\n\tfillProps_gt(>, pMB, pML->currentTag);\n\tgt.flagSelection(>, &pMB->vertices, &pMB->triangles);\n\tgt.transformFlagged(>, &pMB->vertices);\n\treturn 1;\n}\nint ModelLoader::processTag_a2mesh(ModelLoader* pML) {\n\tModelBuilder* pMB = pML->pModelBuilder;\n\tstd::string tagStr = pML->currentTag;\n\tGroupTransform gt;\n\tfillProps_gt(>, pMB, pML->currentTag);\n\tgt.flagSelection(>, &pMB->vertices, &pMB->triangles);\n\t\/\/clone a copy\n\tstd::vector<Vertex01*> vx1;\n\tstd::vector<Triangle01*> tr1;\n\tgt.cloneFlagged(NULL, &vx1, &tr1, &pMB->vertices, &pMB->triangles);\n\t\/\/ build transform and inverted martrices\n\tmat4x4 transformMatrix;\n\tgt.buildTransformMatrix(>, &transformMatrix);\n\tmat4x4 transformMatrixInverted;\n\tmat4x4_invert(transformMatrixInverted, transformMatrix);\n\t\/\/move\/rotate cloned\n\tgt.flagAll(&vx1, &tr1);\n\t\/\/gt.transformFlagged(&pMB->vertices, &transformMatrixInverted);\n\tgt.transformFlaggedMx(&vx1, &transformMatrixInverted);\n\n\t\/\/gt.cloneFlagged(pMB, &pMB->vertices, &pMB->triangles, &vx1, &tr1);\n\n\tfloat wh[2];\n\tsetFloatArray(wh, 2, "wh", tagStr);\n\tPolygon frame;\n\tframe.setRectangle(&frame, wh[0], wh[1]);\n\t\/\/destination arrays\n\tstd::vector<Vertex01*> vx2;\n\tstd::vector<Triangle01*> tr2;\n\tPolygon triangle;\n\tfor (int i = tr1.size() - 1; i >= 0; i--) {\n\t\ttriangle.setTriangle(&triangle, tr1.at(i), &vx1);\n\t\tPolygon intersection;\n\t\tint pointsN = Polygon::xyIntersection(&intersection, &frame, &triangle);\n\t\tif (pointsN > 2) {\n\t\t\tPolygon::buildTriangles(&intersection);\n\t\t\tGroupTransform::flagAll(&intersection.vertices, &intersection.triangles);\n\t\t\tGroupTransform::cloneFlagged(NULL, &vx2, &tr2, &intersection.vertices, &intersection.triangles);\n\t\t}\n\t}\n\tgt.flagAll(&vx2, &tr2);\n\t\/\/at this point we have cutted fragment facing us\n\tint vxTotal = vx2.size();\n\tint trTotal = tr2.size();\n\t\/\/apply adjusted material ?\n\tif (pML->pMaterialAdjust != NULL) {\n\t\t\/\/scan vertices to find new (unupdated) material\n\t\tint materialNsrc = -1; \/\/which N to replace\n\t\tint materialNdst = -1; \/\/replace by N \n\t\tfor (int vN = 0; vN < vxTotal; vN++) {\n\t\t\tVertex01* pV = vx2.at(vN);\n\t\t\tif (pV->flag < 0)\n\t\t\t\tcontinue;\n\t\t\tif (materialNsrc == pV->materialN)\n\t\t\t\tcontinue;\n\t\t\t\/\/have new material\n\t\t\tmaterialNsrc = pV->materialN;\n\t\t\tMaterial mt;\n\t\t\tMaterial* pMt0 = pMB->materialsList.at(materialNsrc);\n\t\t\tmemcpy(&mt, pMt0, sizeof(Material));\n\t\t\t\/\/modify material\n\t\t\tMaterialAdjust::adjust(&mt, pML->pMaterialAdjust);\n\t\t\tmaterialNdst = pMB->getMaterialN(pMB, &mt);\n\t\t\tif (materialNsrc != materialNdst) {\n\t\t\t\t\/\/replace mtN in vx and tr arrays\n\t\t\t\tfor (int vN2 = vN; vN2 < vxTotal; vN2++) {\n\t\t\t\t\tVertex01* pV2 = vx2.at(vN2);\n\t\t\t\t\tif (pV2->flag < 0)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif (materialNsrc == pV2->materialN)\n\t\t\t\t\t\tpV2->materialN = materialNdst;\n\t\t\t\t}\n\t\t\t\tfor (int tN2 = 0; tN2 < trTotal; tN2++) {\n\t\t\t\t\tTriangle01* pT2 = tr2.at(tN2);\n\t\t\t\t\tif (pT2->flag < 0)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif (materialNsrc == pT2->materialN)\n\t\t\t\t\t\tpT2->materialN = materialNdst;\n\t\t\t\t}\n\t\t\t\tmaterialNsrc = materialNdst;\n\t\t\t}\n\t\t}\n\t}\n\telse { \/\/ pML->pMaterialAdjust == NULL, use pMB->usingMaterialN\n\t\tfor (int vN2 = 0; vN2 < vxTotal; vN2++) {\n\t\t\tVertex01* pV2 = vx2.at(vN2);\n\t\t\tif (pV2->flag < 0)\n\t\t\t\tcontinue;\n\t\t\tpV2->materialN = pMB->usingMaterialN;\n\t\t}\n\t\tfor (int tN2 = 0; tN2 < trTotal; tN2++) {\n\t\t\tTriangle01* pT2 = tr2.at(tN2);\n\t\t\tif (pT2->flag < 0)\n\t\t\t\tcontinue;\n\t\t\tpT2->materialN = pMB->usingMaterialN;\n\t\t}\n\t}\n\t\/\/apply xywh\/2nm ?\n\tif (varExists("xywh", tagStr) || varExists("xywh2nm", tagStr)) {\n\t\tMaterial* pMT = pMB->materialsList.at(vx2.at(0)->materialN);\n\t\tfloat xywh[4] = { 0,0,1,1 };\n\t\tTexCoords* pTC = NULL;\n\t\tif (varExists("xywh", tagStr)) {\n\t\t\tsetFloatArray(xywh, 4, "xywh", tagStr);\n\t\t\tstd::string flipStr = getStringValue("flip", tagStr);\n\t\t\tint texN = pMT->uTex1mask;\n\t\t\tif (texN < 0)\n\t\t\t\ttexN = pMT->uTex0;\n\t\t\tTexCoords tc;\n\t\t\ttc.set(texN, xywh[0], xywh[1], xywh[2], xywh[3], flipStr);\n\t\t\tpTC = &tc;\n\t\t}\n\t\tTexCoords* pTC2nm = NULL;\n\t\tif (varExists("xywh2nm", tagStr)) {\n\t\t\tsetFloatArray(xywh, 4, "xywh2nm", tagStr);\n\t\t\tstd::string flipStr = getStringValue("flip2nm", tagStr);\n\t\t\tTexCoords tc2nm;\n\t\t\ttc2nm.set(pMT->uTex2nm, xywh[0], xywh[1], xywh[2], xywh[3], flipStr);\n\t\t\tpTC2nm = &tc2nm;\n\t\t}\n\t\tpMB->applyTexture2flagged(&vx2, "front", pTC, false);\n\t\tpMB->applyTexture2flagged(&vx2, "front", pTC2nm, true);\n\t}\n\n\tfloat detachBy =0;\n\tsetFloatValue(&detachBy, "detachBy", tagStr);\n\tif (detachBy != 0) {\n\t\tmat4x4 mx;\n\t\tmat4x4_translate(mx, 0, 0, detachBy);\n\t\tgt.transformFlaggedMx(&vx2, &mx);\n\t}\n\t\/\/move\/rotate back\n\tgt.transformFlaggedMx(&vx2, &transformMatrix);\n\t\/\/clone back to modelBuilder arrays\n\tgt.cloneFlagged(pMB, &pMB->vertices, &pMB->triangles, &vx2, &tr2);\n\n\t\/\/clear memory\n\tfor (int i = vx1.size() - 1; i >= 0; i--)\n\t\tdelete vx1.at(i);\n\tvx1.clear();\n\tfor (int i = tr1.size() - 1; i >= 0; i--)\n\t\tdelete tr1.at(i);\n\ttr1.clear();\n\tfor (int i = vx2.size() - 1; i >= 0; i--)\n\t\tdelete vx2.at(i);\n\tvx2.clear();\n\tfor (int i = tr2.size() - 1; i >= 0; i--)\n\t\tdelete tr2.at(i);\n\ttr2.clear();\n\n\treturn 1;\n}\nint ModelLoader::processTag_element(ModelLoader* pML) {\n\tModelBuilder* pMB = pML->pModelBuilder;\n\tstd::string tagStr = pML->currentTag;\n\tstd::string sourceFile = getStringValue("element", tagStr);\n\tstd::string subjClass = getStringValue("class", tagStr);\n\tstd::vector<GameSubj*>* pSubjsVector0 = pML->pSubjsVector;\n\tint subjN = -1;\n\tif (!sourceFile.empty()) {\n\t\tsourceFile = buildFullPath(pML, sourceFile);\n\t\tsubjN = loadModel(pSubjsVector0, sourceFile, subjClass);\n\t}\n\telse { \/\/sourceFile not specified\n\t\tsubjN = pML->pSubjsVector->size();\n\t\tGameSubj* pGS = theGame.newGameSubj(subjClass);\n\t\tpGS->pSubjsSet = pSubjsVector0;\n\t\tpGS->nInSubjsSet = subjN;\n\t\tpML->pSubjsVector->push_back(pGS);\n\t\tpGS->totalNativeElements = 1;\n\t\tpGS->totalElements = 1;\n\t\tif (!pML->closedTag) { \/\/DrawJobs will follow\n\t\t\tpMB->usingSubjsStack.push_back(pMB->usingSubjN);\n\t\t\tpMB->useSubjN(pMB, subjN);\n\t\t}\n\t}\n\t\/\/keep reading tag\n\tGameSubj* pGS = pSubjsVector0->at(subjN);\n\tint rootN = pMB->subjNumbersList.at(0);\n\tstd::string attachTo = getStringValue("attachTo", tagStr);\n\tif (attachTo.empty()) \/\/attach to root\n\t\tpGS->d2parent = subjN - rootN;\n\telse {\n\t\t\/\/find parent by name\n\t\tfor (int sN = subjN - 1; sN >= rootN; sN--) {\n\t\t\tif (strcmp(pSubjsVector0->at(sN)->name, attachTo.c_str()) == 0) {\n\t\t\t\tpGS->d2parent = subjN - sN;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tstd::string headTo = getStringValue("headTo", tagStr);\n\tif (!headTo.empty()) { \/\/find headTo by name\n\t\tfor (int sN = subjN - 1; sN >= rootN; sN--) {\n\t\t\tif (strcmp(pSubjsVector0->at(sN)->name, headTo.c_str()) == 0) {\n\t\t\t\tpGS->d2headTo = subjN - sN;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tfloat xyz[3]={0,0,0};\n\t\/\/position\n\tsetFloatArray(xyz, 3, "pxyz", tagStr);\n\tsetFloatValue(&xyz[0], "px", tagStr);\n\tsetFloatValue(&xyz[1], "py", tagStr);\n\tsetFloatValue(&xyz[2], "pz", tagStr);\n\tv3copy(pGS->ownCoords.pos, xyz);\n\t\/\/angles\n\tv3set(xyz, 0,0,0);\n\tsetFloatArray(xyz, 3, "axyz", tagStr);\n\tsetFloatValue(&xyz[0], "ax", tagStr);\n\tsetFloatValue(&xyz[1], "ay", tagStr);\n\tsetFloatValue(&xyz[2], "az", tagStr);\n\tv3set(pGS->ownCoords.eulerDg, xyz[0], xyz[1], xyz[2]);\n\treturn 1;\n}\n\n<\/pre><\/div>\n\n\n
\n\n\n\n\n#pragma once\n#include <string>\n#include <vector>\n#include "Vertex01.h"\n#include "Triangle01.h"\n#include "VirtualShape.h"\n#include "Group01.h"\n#include "Material.h"\n#include "GameSubj.h"\n#include <map>\n\nclass ModelBuilder1base\n{\npublic:\n\tstd::vector<Vertex01*> vertices;\n\tstd::vector<Triangle01*> triangles;\n\tstd::vector<int> subjNumbersList;\n\tint usingSubjN = -1;\n\tstd::vector<int> usingSubjsStack;\n\n\tstd::vector<Group01*> groupsStack;\n\tGroup01* pCurrentGroup = NULL;\n\tGroup01* pLastClosedGroup = NULL;\n\t\n\tstd::vector<VirtualShape*> vShapesStack;\n\tVirtualShape* pCurrentVShape = NULL;\n\n\tstd::vector<Material*> materialsList;\n\tint usingMaterialN = -1;\n\tstd::vector<int> materialsStack;\n\n\tstd::map<std::string, int> texturesHashMap;\npublic:\n\tvirtual ~ModelBuilder1base();\n\tstatic int useSubjN(ModelBuilder1base* pMB, int subjN);\n\tstatic int getMaterialN(ModelBuilder1base* pMB, Material* pMT);\n\tstatic void lockGroup(ModelBuilder1base* pMB);\n\tstatic void releaseGroup(ModelBuilder1base* pMB);\n\tstatic int addVertex(ModelBuilder1base* pMB, float kx, float ky, float kz, float nx, float ny, float nz);\n\tstatic int add2triangles(ModelBuilder1base* pMB, int nNW, int nNE, int nSW, int nSE, int n);\n\tstatic int addTriangle(ModelBuilder1base* pMB, int n0, int n1, int n2);\n\tstatic int buildDrawJobs(ModelBuilder1base* pMB, std::vector<GameSubj*>* pGameSubjs);\n\tstatic int rearrangeArraysForDrawJob(std::vector<Vertex01*>* pAllVertices, std::vector<Vertex01*>* pUseVertices, std::vector<Triangle01*>* pUseTriangles);\n\tstatic int buildSingleDrawJob(Material* pMT, std::vector<Vertex01*>* pVertices, std::vector<Triangle01*>* pTriangles);\n\tstatic int moveGroupDg(ModelBuilder1base* pMB, float aX, float aY, float aZ, float kX, float kY, float kZ);\n\tstatic int calculateTangentSpace(std::vector<Vertex01*>* pUseVertices, std::vector<Triangle01*>* pUseTriangles);\n\tstatic int finalizeLine(std::vector<Vertex01*>* pVerts, int lineStartsAt = 0, int lineEndsAt = 0);\n\tstatic int optimizeMesh(std::vector<Vertex01*>* pVertices, std::vector<Triangle01*>* pTriangles);\n};\n\n<\/pre><\/div>\n\n\n
\n\n\n\n
<\/p>\n\n\n\n