{"body":"    Node* SquareGrid(int length, float unit) {\n\n        unsigned vertexCount = pow(length + 1, 2);\n        unsigned vertexDataElementCount = vertexCount * 6;\n        float vertexData[vertexDataElementCount];\n        int rowNumber = 0;  // vertex row\n        URHO3D_LOGINFO(String(vertexCount) + \" VERTICES\");\n        for (unsigned i = 0; i < vertexDataElementCount; i += 6) {\n            // one vertex (and its normal) per loop\n            int vertexNumber = i / 6;\n            if (vertexNumber && vertexNumber % (length + 1) == 0) { // edge vertex\n                rowNumber++;\n            }\n\n            Vector3& position = *(reinterpret_cast<Vector3*>(&vertexData[i]));\n            Vector3& normal = *(reinterpret_cast<Vector3*>(&vertexData[i + 3]));\n\n            int x = unit * rowNumber;\n            int z = unit * (vertexNumber % (length + 1));\n\n            Vector3 p = Vector3(x, 0, z);\n            /*\n            URHO3D_LOGINFO(p.ToString());\n            */\n            vertices_.Push(p);\n            position = p;\n            normal = Vector3(0, 1, 0);\n        }\n        rowNumber = 0;  // triangle row\n        int halfTriangleCount = pow(length, 2);\n        int indexDataElementCount = 2 * halfTriangleCount * 6;\n        unsigned short indexData[indexDataElementCount];\n        URHO3D_LOGINFO(String(2 * halfTriangleCount) + \" TRIANGLES\");\n        triangles_.Reserve((unsigned)(2 * halfTriangleCount));\n        for (unsigned i = 0; i < halfTriangleCount; ++i) {\n            /*  \n             *  two triangles per loop\n             *\n             *   a ----- b     (a b c)\n             *   |       |     (c b d)\n             *   |       |\n             *   |       |\n             *   c ----- d\n             */\n\n            if (i && i % length == 0) { // end triangle\n                rowNumber++;\n            }\n\n            int a = rowNumber + i;\n            int b = rowNumber + i + 1;\n            int c = rowNumber + i + length + 1;\n            int d = rowNumber + i + length + 2;\n\n            indexData[6 * i]     = a;\n            indexData[6 * i + 1] = b;\n            indexData[6 * i + 2] = c;\n\n            indexData[6 * i + 3] = c;\n            indexData[6 * i + 4] = b;\n            indexData[6 * i + 5] = d;\n\n            triangles_.Push(a);\n            triangles_.Push(b);\n            triangles_.Push(c);\n\n            triangles_.Push(c);\n            triangles_.Push(b);\n            triangles_.Push(d);\n\n            /*\n            URHO3D_LOGINFO(String(a) + \" \" + String(b) + \" \" + String(c));\n            URHO3D_LOGINFO(String(c) + \" \" + String(b) + \" \" + String(d));\n            */\n        }\n\n        Model* model = new Model(context_);\n        VertexBuffer* vertexBuffer = new VertexBuffer(context_);\n        IndexBuffer* indexBuffer = new IndexBuffer(context_);\n        Geometry* geometry = new Geometry(context_);\n\n        // maintain copy of vertex and index buffers in system\n        // (non-graphics card) memory\n        vertexBuffer->SetShadowed(true);\n        indexBuffer->SetShadowed(true);\n\n        // describe “layout‟ of vertexData array\n        PODVector<VertexElement> vertexDataLayout;\n        vertexDataLayout.Push(VertexElement(TYPE_VECTOR3, SEM_POSITION));\n        vertexDataLayout.Push(VertexElement(TYPE_VECTOR3, SEM_NORMAL));\n\n        // bool param below designates buffer as dynamic\n        vertexBuffer->SetSize(vertexCount, vertexDataLayout);\n\n        // second bool param below designates buffer as dynamic\n        indexBuffer->SetSize(vertexCount, false, false);\n\n        // (probably) queue vertex and index buffer data to be uploaded to\n        // the graphics card\n        vertexBuffer->SetData(vertexData);\n        indexBuffer->SetData(indexData);\n\n        // glue everything together in Geometry instance\n        geometry->SetVertexBuffer(0, vertexBuffer);\n        geometry->SetIndexBuffer(indexBuffer);\n        geometry->SetDrawRange(TRIANGLE_LIST, 0, vertexCount);  // TODO: ?\n\n        // glue geometry to higher-level Model instance\n        model->SetNumGeometries(1);\n        model->SetGeometry(0, 0, geometry);\n        // TODO: adjust below when animating?\n        model->SetBoundingBox(BoundingBox(Vector3(0, 0, 0), Vector3(1, 0, 1)));\n        // TODO: list vertex and index buffers on Model instance for serialisation?\n        \n        Node* modelNode = node_->CreateChild(\"flat-square\");\n        modelNode->SetPosition(Vector3::ZERO);\n        StaticModel* object = modelNode->CreateComponent<StaticModel>();\n        object->SetModel(model);\n        return modelNode;\n    }","name":"mesh generation","extension":"cpp","url":"https://www.irccloud.com/pastebin/n7QyNGIT/mesh+generation","modified":1500909015,"id":"n7QyNGIT","size":4526,"lines":120,"own_paste":false,"theme":"","date":1500909002}