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