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\u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u0430, \u043d\u043e \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0435\u0449\u0435 1 \u0432\u043e\u043f\u0440\u043e\u0441:<\/p>\n\n\n\n
\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 316 \u0432\u0435\u0440\u0442\u0435\u043a\u0441\u043e\u0432 \u0438 144 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 (432 \u0438\u043d\u0434\u0435\u043a\u0441\u0430), \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 3D \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438. \u041d\u043e \u0432\u0441\u0435-\u0442\u0430\u043a\u0438, \u043e\u0442\u043a\u0443\u0434\u0430 \u0421\u0422\u041e\u041b\u042c\u041a\u041e-\u0442\u043e??<\/p>\n\n\n\n
\u041d\u0443, \u0441\u0430\u043c\u0430 \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <\/p>\n\n\n\n
\u0418\u0442\u043e\u0433\u043e – 96 \u0432\u0435\u0440\u0442\u0435\u043a\u0441\u043e\u0432.<\/p>\n\n\n\n
\u0422\u0430\u043a \u0447\u0442\u043e, 316 \u0432\u0435\u0440\u0442\u0435\u043a\u0441\u043e\u0432 – \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e.<\/p>\n\n\n\n
\u041e\u0434\u043d\u0430\u043a\u043e, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0433\u043b\u044b, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 3-\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/p>\n\n\n\n
<\/p>\n\n\n\n
<\/p>\n\n\n\n
\u0422\u043e \u0435\u0441\u0442\u044c, \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0430 \u0430\u0436 \u0432 4-\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u0445 !<\/p>\n\n\n\n
\u041d\u0430\u0448\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 – \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044b.<\/p>\n\n\n\n
\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 ModelBuilder1base<\/strong>, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 buildSingleDrawJob(..)<\/em>. <\/p>\n\n\n\n 1. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c VS, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c C:\\CPP\\a997modeler\\p_windows\\p_windows.sln<\/em>.<\/p>\n\n\n\n 2. \u0417\u0430\u043c\u0435\u043d\u0438\u043c ModelBuilder1base.h <\/em>\u043a\u043e\u0434 \u043d\u0430: <\/p>\n\n\n <\/p>\n\n\n\n 3. \u0417\u0430\u043c\u0435\u043d\u0438\u043c ModelBuilder1base.cpp <\/em>\u043a\u043e\u0434 \u043d\u0430: <\/p>\n\n\n\n 4. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a. <\/p>\n\n\n\n \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0442\u0430 \u0436\u0435, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e 316 \u0432\u0435\u0440\u0442\u0435\u043a\u0441\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u043e 219, \u043d\u0430 31% \u043c\u0435\u043d\u044c\u0448\u0435<\/strong>, \u0434\u0430\u0436\u0435 \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u043c \u044f \u043e\u0436\u0438\u0434\u0430\u043b.<\/p>\n\n\n\n \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438:<\/p>\n\n\n\n \u041d\u0435 \u043f\u043e \u0442\u0435\u043c\u0435:<\/p>\n\n\n\n \u041f\u043e\u043a\u0430 \u0442\u0440\u0443\u0434\u0438\u043b\u0441\u044f \u043d\u0430\u0434 \u044d\u0442\u043e\u0439 \u0433\u043b\u0430\u0432\u043e\u0439, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043e\u0434\u043d\u0443 \u043f\u043b\u0435\u043d\u043a\u0443 (\u0431\u0435\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438). \u0414\u0443\u043c\u0430\u044e, \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0435\u043e:<\/p>\n\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\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#include "ModelBuilder1base.h"\n#include "platform.h"\n#include "utils.h"\n#include "DrawJob.h"\n#include "Shader.h"\n\nextern float degrees2radians;\n\nModelBuilder1base::~ModelBuilder1base() {\n\treleaseGroup(this);\n\n\t\/\/clear all vectors\n\tint itemsN = vertices.size();\n\tfor (int i = 0; i < itemsN; i++)\n\t\tdelete vertices.at(i);\n\tvertices.clear();\n\n\titemsN = triangles.size();\n\tfor (int i = 0; i < itemsN; i++)\n\t\tdelete triangles.at(i);\n\ttriangles.clear();\n\n\titemsN = vShapesStack.size();\n\tfor (int i = 0; i < itemsN; i++)\n\t\tdelete vShapesStack.at(i);\n\tvShapesStack.clear();\n\n\titemsN = groupsStack.size();\n\tfor (int i = 0; i < itemsN; i++)\n\t\tdelete groupsStack.at(i);\n\tgroupsStack.clear();\n\tif (pCurrentGroup != NULL)\n\t\tdelete pCurrentGroup;\n\tif (pLastClosedGroup != NULL)\n\t\tdelete pLastClosedGroup;\n\n\titemsN = materialsList.size();\n\tfor (int i = 0; i < itemsN; i++)\n\t\tdelete materialsList.at(i);\n\tmaterialsList.clear();\n\n\tsubjNumbersList.clear();\n}\nint ModelBuilder1base::useSubjN(ModelBuilder1base* pMB, int subjN) {\n\tpMB->usingSubjN = subjN;\n\tint itemsN = pMB->subjNumbersList.size();\n\tbool newN = true;\n\tif (itemsN > 0)\n\t\tfor (int i = 0; i < itemsN; i++)\n\t\t\tif (pMB->subjNumbersList.at(i) == subjN) {\n\t\t\t\tnewN = false;\n\t\t\t\tbreak;\n\t\t\t}\n\tif (newN)\n\t\tpMB->subjNumbersList.push_back(subjN);\n\treturn subjN;\n}\nint ModelBuilder1base::getMaterialN(ModelBuilder1base* pMB, Material* pMT) {\n\tint itemsN = pMB->materialsList.size();\n\tif (itemsN > 0)\n\t\tfor (int i = 0; i < itemsN; i++)\n\t\t\tif (memcmp(pMB->materialsList.at(i), pMT, sizeof(Material)) == 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\/\/if here - add new material to the list\n\tMaterial* pMTnew = new Material(*pMT);\n\tpMB->materialsList.push_back(pMTnew);\n\treturn itemsN;\n}\nint ModelBuilder1base::add2triangles(ModelBuilder1base* pMB, int nNW, int nNE, int nSW, int nSE, int n) {\n\t\/\/indexes: NorthWest, NorthEast, SouthWest,SouthEast\n\tif (n % 2 == 0) { \/\/even number\n\t\taddTriangle(pMB, nNW, nSW, nNE);\n\t\taddTriangle(pMB, nNE, nSW, nSE);\n\t}\n\telse { \/\/odd number\n\t\taddTriangle(pMB, nNW, nSE, nNE);\n\t\taddTriangle(pMB, nNW, nSW, nSE);\n\t}\n\treturn pMB->triangles.size() - 1;\n}\nint ModelBuilder1base::addTriangle(ModelBuilder1base* pMB, int i0, int i1, int i2) {\n\tTriangle01* pTR = new Triangle01();\n\tpMB->triangles.push_back(pTR);\n\tpTR->idx[0] = i0;\n\tpTR->idx[1] = i1;\n\tpTR->idx[2] = i2;\n\tpTR->subjN = pMB->usingSubjN;\n\tpTR->materialN = pMB->usingMaterialN;\n\t\/\/mark\n\tif (pMB->pCurrentGroup != NULL)\n\t\tif (strcmp(pMB->pCurrentGroup->marks, "") != 0)\n\t\t\tmyStrcpy_s(pTR->marks, 124, pMB->pCurrentGroup->marks);\n\treturn pMB->triangles.size() - 1;\n}\nint ModelBuilder1base::addVertex(ModelBuilder1base* pMB, float kx, float ky, float kz, float nx, float ny, float nz) {\n\tVertex01* pVX = new Vertex01();\n\tpMB->vertices.push_back(pVX);\n\tpVX->aPos[0] = kx;\n\tpVX->aPos[1] = ky;\n\tpVX->aPos[2] = kz;\n\t\/\/normal\n\tpVX->aNormal[0] = nx;\n\tpVX->aNormal[1] = ny;\n\tpVX->aNormal[2] = nz;\n\tpVX->subjN = pMB->usingSubjN;\n\tpVX->materialN = pMB->usingMaterialN;\n\t\/\/mark\n\tif (pMB->pCurrentGroup != NULL)\n\t\tif (strcmp(pMB->pCurrentGroup->marks, "") != 0)\n\t\t\tmyStrcpy_s(pVX->marks, 124, pMB->pCurrentGroup->marks);\n\treturn pMB->vertices.size() - 1;\n}\nint ModelBuilder1base::buildDrawJobs(ModelBuilder1base* pMB, std::vector<GameSubj*>* pGameSubjs) {\n\tint totalSubjsN = pMB->subjNumbersList.size();\n\tif (totalSubjsN < 1) {\n\t\tpMB->subjNumbersList.push_back(-1);\n\t\ttotalSubjsN = 1;\n\t}\n\tint totalMaterialsN = pMB->materialsList.size();\n\tif (totalSubjsN < 2 && totalMaterialsN < 2) {\n\t\t\/\/simple single DrawJob\n\t\tMaterial* pMT = pMB->materialsList.at(0);\n\t\tGameSubj* pGS = NULL;\n\t\tint gsN = pMB->subjNumbersList.at(0);\n\t\tif (gsN >= 0)\n\t\t\tpGS = pGameSubjs->at(gsN);\n\t\tif (pGS != NULL)\n\t\t\tpGS->djStartN = DrawJob::drawJobs.size();\n\t\tbuildSingleDrawJob(pMT, &pMB->vertices, &pMB->triangles);\n\t\tif (pGS != NULL)\n\t\t\tpGS->djTotalN = DrawJob::drawJobs.size() - pGS->djStartN;\n\t\treturn 1;\n\t}\n\tint totalVertsN = pMB->vertices.size();\n\tint totalTrianglesN = pMB->triangles.size();\n\t\/\/clear flags\n\tfor (int vN = 0; vN < totalVertsN; vN++) {\n\t\tVertex01* pVX = pMB->vertices.at(vN);\n\t\tpVX->flag = 0;\n\t}\n\tfor (int tN = 0; tN < totalTrianglesN; tN++) {\n\t\tTriangle01* pTR = pMB->triangles.at(tN);\n\t\tpTR->flag = 0;\n\t}\n\tint addedDJs = 0;\n\tfor (int sN = 0; sN < totalSubjsN; sN++) {\n\t\tGameSubj* pGS = NULL;\n\t\tint gsN = pMB->subjNumbersList.at(sN);\n\t\tif (gsN >= 0)\n\t\t\tpGS = pGameSubjs->at(gsN);\n\t\tif (pGS != NULL)\n\t\t\tpGS->djStartN = DrawJob::drawJobs.size();\n\t\tfor (int mtN = 0; mtN < totalMaterialsN; mtN++) {\n\t\t\tMaterial* pMT = pMB->materialsList.at(mtN);\n\t\t\tstd::vector<Vertex01*> useVertices;\n\t\t\tstd::vector<Triangle01*> useTriangles;\n\t\t\tfor (int vN = 0; vN < totalVertsN; vN++) {\n\t\t\t\tVertex01* pVX = pMB->vertices.at(vN);\n\t\t\t\tif (pVX->flag != 0)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (pVX->subjN != gsN)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (pVX->materialN != mtN)\n\t\t\t\t\tcontinue;\n\t\t\t\t\/\/if here - make a copy\n\t\t\t\tpVX->altN = useVertices.size();\n\t\t\t\tVertex01* pVX2 = new Vertex01(*pVX);\n\t\t\t\tuseVertices.push_back(pVX2);\n\t\t\t\tpVX->flag = 1;\n\t\t\t\tif (pVX->endOfSequence > 0) {\n\t\t\t\t\t\/\/rearrangeArraysForDrawJob(pMB, pMB->vertices, useVertices, useTriangles);\n\t\t\t\t\tbuildSingleDrawJob(pMT, &useVertices, &useTriangles);\n\t\t\t\t\taddedDJs++;\n\t\t\t\t\t\/\/clear and proceed to next sequence\n\t\t\t\t\tint useVerticesN = useVertices.size();\n\t\t\t\t\tfor (int i = 0; i < useVerticesN; i++)\n\t\t\t\t\t\tdelete useVertices.at(i);\n\t\t\t\t\tuseVertices.clear();\n\t\t\t\t}\n\t\t\t}\n\t\t\tint useVerticesN = useVertices.size();\n\t\t\tif (useVerticesN < 1)\n\t\t\t\tcontinue; \/\/to next material\n\t\t\t\/\/pick triangles\n\t\t\tfor (int tN = 0; tN < totalTrianglesN; tN++) {\n\t\t\t\tTriangle01* pTR = pMB->triangles.at(tN);\n\t\t\t\tif (pTR->flag != 0)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (pTR->subjN != gsN)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (pTR->materialN != mtN)\n\t\t\t\t\tcontinue;\n\t\t\t\t\/\/if here - make a copy\n\t\t\t\tTriangle01* pTR2 = new Triangle01(*pTR);\n\t\t\t\tuseTriangles.push_back(pTR2);\n\t\t\t\tpTR->flag = 1;\n\t\t\t}\n\t\t\trearrangeArraysForDrawJob(&pMB->vertices, &useVertices, &useTriangles);\n\t\t\tbuildSingleDrawJob(pMT, &useVertices, &useTriangles);\n\t\t\tuseVerticesN = useVertices.size();\n\t\t\taddedDJs++;\n\t\t\t\/\/clear all for next material\n\t\t\tfor (int i = 0; i < useVerticesN; i++)\n\t\t\t\tdelete useVertices.at(i);\n\t\t\tuseVertices.clear();\n\t\t\tint useTrianglesN = useTriangles.size();\n\t\t\tfor (int i = 0; i < useTrianglesN; i++)\n\t\t\t\tdelete useTriangles.at(i);\n\t\t\tuseTriangles.clear();\n\t\t}\n\t\tif (pGS != NULL)\n\t\t\tpGS->djTotalN = DrawJob::drawJobs.size() - pGS->djStartN;\n\t}\n\treturn addedDJs;\n}\nint ModelBuilder1base::buildSingleDrawJob(Material* pMT, std::vector<Vertex01*>* pVertices, std::vector<Triangle01*>* pTriangles) {\n\tint totalVertsN = pVertices->size();\n\tif (totalVertsN < 1)\n\t\treturn 0;\n\tif (DrawJob::lineWidthIsImportant(pMT->primitiveType)) {\n\t\tif (strcmp(pMT->shaderType, "wire") == 0)\n\t\t\tfinalizeLine(pVertices);\n\t}\n\telse {\n\t\toptimizeMesh(pVertices, pTriangles);\n\t\ttotalVertsN = pVertices->size();\n\t}\n\tif (pMT->uTex2nm >= 0)\n\t\tcalculateTangentSpace(pVertices, pTriangles);\n\tpMT->pickShaderNumber();\n\tDrawJob* pDJ = new DrawJob();\n\t\/\/copy material to DJ\n\tmemcpy(&pDJ->mt, pMT, sizeof(Material));\n\t\/\/calculate VBO element size (stride) and variables offsets in VBO\n\tint VBOid = DrawJob::newBufferId();\n\tint stride = 0;\n\tpDJ->setDesirableOffsets(&stride, pDJ->mt.shaderN, VBOid);\n\t\/\/create an array for VBO\n\tint bufferSize = totalVertsN * stride;\n\tfloat* vertsBuffer = new float[bufferSize];\n\t\/\/fill vertsBuffer\n\tShader* pSh = Shader::shaders.at(pDJ->mt.shaderN);\n\tint floatSize = sizeof(float);\n\tfor (int vN = 0; vN < totalVertsN; vN++) {\n\t\tVertex01* pVX = pVertices->at(vN);\n\t\tint idx = vN * stride \/ floatSize;\n\t\t\/\/pick data from vertex and move to the buffer\n\t\tmemcpy(&vertsBuffer[idx + pDJ->aPos.offset \/ floatSize], pVX->aPos, 3 * floatSize);\n\t\tif (pSh->l_aNormal >= 0) \/\/normal\n\t\t\tmemcpy(&vertsBuffer[idx + pDJ->aNormal.offset \/ floatSize], pVX->aNormal, 3 * floatSize);\n\t\tif (pSh->l_aTuv >= 0) \/\/attribute TUV (texture coordinates)\n\t\t\tmemcpy(&vertsBuffer[idx + pDJ->aTuv.offset \/ floatSize], pVX->aTuv, 2 * floatSize);\n\t\tif (pSh->l_aTuv2 >= 0) \/\/attribute TUV2 (normal maps)\n\t\t\tmemcpy(&vertsBuffer[idx + pDJ->aTuv2.offset \/ floatSize], pVX->aTuv2, 2 * floatSize);\n\t\tif (pSh->l_aTangent >= 0)\n\t\t\tmemcpy(&vertsBuffer[idx + pDJ->aTangent.offset \/ floatSize], pVX->aTangent, 3 * floatSize);\n\t\tif (pSh->l_aBinormal >= 0)\n\t\t\tmemcpy(&vertsBuffer[idx + pDJ->aBinormal.offset \/ floatSize], pVX->aBinormal, 3 * floatSize);\n\t}\n\t\/\/buffer is ready, create VBO\n\tglBindBuffer(GL_ARRAY_BUFFER, VBOid);\n\tglBufferData(GL_ARRAY_BUFFER, bufferSize * floatSize, vertsBuffer, GL_STATIC_DRAW);\n\tdelete[] vertsBuffer;\n\tpDJ->pointsN = totalVertsN;\n\n\tint totalTrianglesN = pTriangles->size();\n\tif (totalTrianglesN > 0) {\n\t\t\/\/create EBO\n\t\tint totalIndexesN = totalTrianglesN * 3;\n\t\t\/\/create buffer\n\t\tGLushort* indexBuffer = new GLushort[totalIndexesN];\n\t\tfor (int tN = 0; tN < totalTrianglesN; tN++) {\n\t\t\tTriangle01* pTR = pTriangles->at(tN);\n\t\t\tint idx = tN * 3;\n\t\t\tindexBuffer[idx] = (GLushort)pTR->idx[0];\n\t\t\tindexBuffer[idx + 1] = (GLushort)pTR->idx[1];\n\t\t\tindexBuffer[idx + 2] = (GLushort)pTR->idx[2];\n\t\t}\n\t\t\/\/buffer is ready, create IBO\n\t\tpDJ->glEBOid = DrawJob::newBufferId();\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pDJ->glEBOid);\n\t\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, totalIndexesN * sizeof(GLushort), indexBuffer, GL_STATIC_DRAW);\n\t\tdelete[] indexBuffer;\n\t\tpDJ->pointsN = totalIndexesN;\n\t}\n\t\/\/create and fill vertex attributes array (VAO)\n\tpDJ->buildVAO();\n\treturn 1;\n}\nint ModelBuilder1base::rearrangeArraysForDrawJob(std::vector<Vertex01*>* pAllVertices, std::vector<Vertex01*>* pUseVertices, std::vector<Triangle01*>* pUseTriangles) {\n\tint totalTrianglesN = pUseTriangles->size();\n\tif (totalTrianglesN < 1)\n\t\treturn 0;\n\t\/\/replace triangle original indices by new numbers saved in original vertices altN\n\tfor (int tN = 0; tN < totalTrianglesN; tN++) {\n\t\tTriangle01* pTR = pUseTriangles->at(tN);\n\t\tfor (int i = 0; i < 3; i++) {\n\t\t\tVertex01* pVX0 = pAllVertices->at(pTR->idx[i]);\n\t\t\tpTR->idx[i] = pVX0->altN;\n\t\t}\n\t}\n\treturn 1;\n}\n\nint ModelBuilder1base::moveGroupDg(ModelBuilder1base* pMB, float aX, float aY, float aZ, float kX, float kY, float kZ) {\n\t\/\/moves and rotates vertex group\n\t\/\/rotation angles are set in degrees\n\tmat4x4 transformMatrix = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };\n\tmat4x4_translate(transformMatrix, kX, kY, kZ);\n\t\/\/rotation order: Z-X-Y\n\tif (aY != 0) mat4x4_rotate_Y(transformMatrix, transformMatrix, degrees2radians * aY);\n\tif (aX != 0) mat4x4_rotate_X(transformMatrix, transformMatrix, degrees2radians * aX);\n\tif (aZ != 0) mat4x4_rotate_Z(transformMatrix, transformMatrix, degrees2radians * aZ);\n\n\tint vertsN = pMB->vertices.size();\n\tfor (int i = pMB->pCurrentGroup->fromVertexN; i < vertsN; i++) {\n\t\tVertex01* pVX = pMB->vertices.at(i);\n\t\tmat4x4_mul_vec4plus(pVX->aPos, transformMatrix, pVX->aPos, 1);\n\t\tmat4x4_mul_vec4plus(pVX->aNormal, transformMatrix, pVX->aNormal, 0);\n\t}\n\treturn 1;\n}\n\nint ModelBuilder1base::calculateTangentSpace(std::vector<Vertex01*>* pUseVertices, std::vector<Triangle01*>* pUseTriangles) {\n\tint totalVertsN = pUseVertices->size();\n\tif (totalVertsN < 1)\n\t\treturn 0;\n\tint totalTrianglesN = pUseTriangles->size();\n\t\/\/assuming that GL_TRIANGLES\n\t\/\/clear flags\n\tfor (int vN = 0; vN < totalVertsN; vN++) {\n\t\tVertex01* pV = pUseVertices->at(vN);\n\t\tpV->flag = 0;\n\t}\n\tfor (int vN = 0; vN < totalVertsN; vN++) {\n\t\tVertex01* pVX = pUseVertices->at(vN);\n\t\tif (pVX->flag != 0)\n\t\t\tcontinue;\n\t\tTriangle01* pT = NULL;\n\t\tfor (int tN = 0; tN < totalTrianglesN; tN++) {\n\t\t\tpT = pUseTriangles->at(tN);\n\t\t\tbool haveTriangle = false;\n\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\tif (pT->idx[i] == vN) {\n\t\t\t\t\thaveTriangle = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tif (haveTriangle)\n\t\t\t\tbreak;\n\t\t}\n\t\tVertex01* pV[3];\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tpV[i] = pUseVertices->at(pT->idx[i]);\n\n\t\tfloat dPos1[3];\n\t\tfloat dPos2[3];\n\t\tfloat dUV1[2];\n\t\tfloat dUV2[2];\n\t\tfor (int i = 0; i < 3; i++) {\n\t\t\tdPos1[i] = pV[1]->aPos[i] - pV[0]->aPos[i];\n\t\t\tdPos2[i] = pV[2]->aPos[i] - pV[0]->aPos[i];\n\t\t}\n\t\tfor (int i = 0; i < 2; i++) {\n\t\t\tdUV1[i] = pV[1]->aTuv2[i] - pV[0]->aTuv2[i];\n\t\t\tdUV2[i] = pV[2]->aTuv2[i] - pV[0]->aTuv2[i];\n\t\t}\n\n\t\tfloat tangent[3];\n\t\tfloat binormal[3];\n\t\tfloat divider = dUV1[0] * dUV2[1] - dUV1[1] * dUV2[0];\n\t\tif (divider == 0) {\n\t\t\tv3set(tangent, 1, 0, 0);\n\t\t\tv3set(binormal, 0, -1, 0);\n\t\t}\n\t\telse {\n\t\t\tfloat r = 1.0f \/ divider;\n\t\t\tfor (int i = 0; i < 3; i++) {\n\t\t\t\ttangent[i] = (dPos1[i] * dUV2[1] - dPos2[i] * dUV1[1]) * r;\n\t\t\t\tbinormal[i] = -(dPos2[i] * dUV1[0] - dPos1[i] * dUV2[0]) * r;\n\t\t\t}\n\t\t\tvec3_norm(tangent, tangent);\n\t\t\tvec3_norm(binormal, binormal);\n\t\t}\n\t\t\/\/add to all 3 vertices\n\t\tfor (int n = 0; n < 3; n++) {\n\t\t\tif (pV[n]->flag > 0)\n\t\t\t\tcontinue;\n\t\t\tv3copy(pV[n]->aTangent, tangent);\n\t\t\tv3copy(pV[n]->aBinormal, binormal);\n\t\t\tpV[n]->flag = 1;\n\t\t}\n\t}\n\t\/\/normalize tangent and binormal around normal\n\tfor (int vN = 0; vN < totalVertsN; vN++) {\n\t\tVertex01* pV = pUseVertices->at(vN);\n\t\tfloat v3out[3];\n\t\t\/\/tangent\n\t\tvec3_mul_cross(v3out, pV->aNormal, pV->aBinormal);\n\t\tif (v3dotProduct(pV->aTangent, v3out) < 0)\n\t\t\tv3inverse(v3out);\n\t\tv3copy(pV->aTangent, v3out);\n\t\t\/\/binormal\n\t\tvec3_mul_cross(v3out, pV->aNormal, pV->aTangent);\n\t\tif (v3dotProduct(pV->aBinormal, v3out) < 0)\n\t\t\tv3inverse(v3out);\n\t\tv3copy(pV->aBinormal, v3out);\n\t}\n\treturn 1;\n}\nvoid ModelBuilder1base::lockGroup(ModelBuilder1base* pMB) {\n\tGroup01* pPrevGroup = pMB->pCurrentGroup;\n\tif (pMB->pCurrentGroup != NULL)\n\t\tpMB->groupsStack.push_back(pMB->pCurrentGroup);\n\tpMB->pCurrentGroup = new Group01();\n\tpMB->pCurrentGroup->fromVertexN = pMB->vertices.size();\n\tpMB->pCurrentGroup->fromTriangleN = pMB->triangles.size();\n\t\/\/marks\n\tif(pPrevGroup != NULL)\n\t\tif (strcmp(pPrevGroup->marks, "") != 0)\n\t\t\tmyStrcpy_s(pMB->pCurrentGroup->marks, 124, pPrevGroup->marks);\n}\nvoid ModelBuilder1base::releaseGroup(ModelBuilder1base* pMB) {\n\tif (pMB->pLastClosedGroup != NULL)\n\t\tdelete pMB->pLastClosedGroup;\n\tpMB->pLastClosedGroup = pMB->pCurrentGroup;\n\n\tif (pMB->groupsStack.size() > 0) {\n\t\tpMB->pCurrentGroup = pMB->groupsStack.back();\n\t\tpMB->groupsStack.pop_back();\n\t}\n\telse\n\t\tpMB->pCurrentGroup = NULL;\n}\nint ModelBuilder1base::finalizeLine(std::vector<Vertex01*>* pVerts, int lineStartsAt, int lineEndsAt) {\n\tif (lineEndsAt <= 0)\n\t\tlineEndsAt = pVerts->size() - 1;\n\tVertex01* pV0 = pVerts->at(lineStartsAt);\n\tVertex01* pV2 = pVerts->at(lineEndsAt);\n\tbool closedLine = false;\n\tif (v3match(pV0->aPos, pV2->aPos))\n\t\tclosedLine = true;\n\tfor (int vN = lineStartsAt; vN <= lineEndsAt; vN++) {\n\t\tVertex01* pV = pVerts->at(vN);\n\t\t\/\/prev point\n\t\tif (vN == lineStartsAt) {\n\t\t\t\/\/first point\n\t\t\tif (closedLine)\n\t\t\t\tpV0 = pVerts->at(lineEndsAt);\n\t\t\telse\n\t\t\t\tpV0 = NULL;\n\t\t}\n\t\telse\n\t\t\tpV0 = pVerts->at(vN - 1);\n\t\t\/\/next point\n\t\tif (vN == lineEndsAt) {\n\t\t\t\/\/last point\n\t\t\tif (closedLine)\n\t\t\t\tpV2 = pVerts->at(lineStartsAt);\n\t\t\telse\n\t\t\t\tpV2 = NULL;\n\t\t}\n\t\telse\n\t\t\tpV2 = pVerts->at(vN + 1);\n\t\t\/\/distances to neighbor points\n\t\tfloat distFromPrev = 0;\n\t\tfloat dirFromPrev[3] = { 0,0,0 };\n\t\tif (pV0 != NULL) {\n\t\t\tdistFromPrev = v3lengthFromTo(pV0->aPos, pV->aPos);\n\t\t\tv3dirFromTo(dirFromPrev, pV0->aPos, pV->aPos);\n\t\t}\n\t\tfloat distToNext = 0;\n\t\tfloat dirToNext[3] = { 0,0,0 };\n\t\tif (pV2 != NULL) {\n\t\t\tdistToNext = v3lengthFromTo(pV->aPos, pV2->aPos);\n\t\t\tv3dirFromTo(dirToNext, pV->aPos, pV2->aPos);\n\t\t}\n\t\tfloat distTotal = distFromPrev + distToNext;\n\t\tfloat kPrev = distFromPrev \/ distTotal;\n\t\tfloat kNext = distToNext \/ distTotal;\n\t\tif (kPrev > kNext * 3)\n\t\t\tv3copy(pV->aNormal, dirFromPrev);\n\t\telse if (kNext > kPrev * 3)\n\t\t\tv3copy(pV->aNormal, dirToNext);\n\t\telse\n\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\tpV->aNormal[i] = kPrev * dirFromPrev[i] + kNext * dirToNext[i];\n\t\tvec3_norm(pV->aNormal, pV->aNormal);\n\t}\n\treturn 1;\n}\nint ModelBuilder1base::optimizeMesh(std::vector<Vertex01*>* pVertices, std::vector<Triangle01*>* pTriangles) {\n\tint trianglesN0 = pTriangles->size();\n\tif (trianglesN0 == 0)\n\t\treturn 0;\n\tint vertsN0 = pVertices->size();\n\t\/\/clear verts first for comparison\n\tfor (int vN = 0; vN < vertsN0; vN++) {\n\t\tVertex01* pV = pVertices->at(vN);\n\t\tmyStrcpy_s(pV->marks, 124, "");\n\t\tpV->altN = -1;\n\t\tpV->flag = 0;\n\t\tpV->aTangent[0] = 0;\n\t\t\/\/round up\n\t\tfor (int i = 0; i < 3; i++) {\n\t\t\tpV->aPos[i] = round(pV->aPos[i] * 1000.0) \/ 1000.0;\n\t\t\tpV->aNormal[i] = round(pV->aNormal[i] * 1000.0) \/ 1000.0;\n\t\t}\n \t}\n\t\/\/find the same verts\n\tint matchesN = 0;\n\tfor (int vN = 0; vN < vertsN0-1; vN++) {\n\t\tVertex01* pV = pVertices->at(vN);\n\t\tif (pV->flag < 0)\n\t\t\tcontinue;\n\t\tfor (int vN2 = vN+1; vN2 < vertsN0; vN2++) {\n\t\t\tVertex01* pV2 = pVertices->at(vN2);\n\t\t\tif (pV2->flag < 0)\n\t\t\t\tcontinue;\n\t\t\tif (memcmp(pV, pV2, sizeof(Vertex01)) != 0)\n\t\t\t\tcontinue;\n\t\t\t\/\/if here - verts are equal\n\t\t\tpV2->flag = -1;\n\t\t\tmatchesN++;\n\t\t\t\/\/change refs in useTriangles from vN2 to vN\n\t\t\tfor (int tN = 0; tN < trianglesN0; tN++) {\n\t\t\t\tTriangle01* pT = pTriangles->at(tN);\n\t\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\t\tif (pT->idx[i] == vN2)\n\t\t\t\t\t\tpT->idx[i] = vN;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (matchesN == 0)\n\t\treturn 0;\n\t\/\/unflag all verts\n\tfor (int vN = 0; vN < vertsN0 - 1; vN++) {\n\t\tVertex01* pV = pVertices->at(vN);\n\t\tpV->flag = -1;\n\t}\n\t\/\/flag verts in use\n\tfor (int tN = 0; tN < trianglesN0; tN++) {\n\t\tTriangle01* pT = pTriangles->at(tN);\n\t\tfor (int i = 0; i < 3; i++) {\n\t\t\tint vN = pT->idx[i];\n\t\t\tVertex01* pV = pVertices->at(vN);\n\t\t\tpV->flag = 0;\n\t\t}\n\t}\n\t\/\/save original useVertices copy\n\tstd::vector<Vertex01*> oldVertices;\n\tfor (int vN = 0; vN < vertsN0; vN++) {\n\t\tVertex01* pV = pVertices->at(vN);\n\t\toldVertices.push_back(pV);\n\t}\n\tpVertices->clear();\n\t\/\/copy back only verts in use\n\tfor (int vN = 0; vN < vertsN0; vN++) {\n\t\tVertex01* pV = oldVertices.at(vN);\n\t\tif (pV->flag < 0)\n\t\t\tcontinue;\n\t\tpV->altN = pVertices->size();\n\t\tpVertices->push_back(pV);\n\t}\n\t\/\/re-factor triangles\n\trearrangeArraysForDrawJob(&oldVertices, pVertices, pTriangles);\n\toldVertices.clear();\n\treturn pVertices->size();\n}\n\n<\/pre><\/div>\n\n\n
\n\n\n\n
\n\n\n\n