Cube* Cube::Create() { static const Scalar Normals[] = { 0, 0, +1.0f, // A+Z 0, -1.0f, 0, // A-Y -1.0f, 0, 0, // A-X 0, 0, +1.0f, // B+Z 0, -1.0f, 0, // B-Y +1.0f, 0, 0, // B+X 0, 0, +1.0f, // C+Z 0, +1.0f, 0, // C+Y +1.0f, 0, 0, // C+X 0, 0, +1.0f, // D+Z 0, +1.0f, 0, // D+Y -1.0f, 0, 0, // D-X 0, 0, -1.0f, // E-Z 0, -1.0f, 0, // E-Y -1.0f, 0, 0, // E-X 0, 0, -1.0f, // F-Z 0, -1.0f, 0, // F-Y +1.0f, 0, 0, // F+X 0, 0, -1.0f, // G-Z 0, +1.0f, 0, // G+Y +1.0f, 0, 0, // G+X 0, 0, -1.0f, // H-Z 0, +1.0f, 0, // H+Y -1.0f, 0, 0 // H-X }; static const int Indices[] = { 0, 9, 6, // +Z 0, 3, 6, 15, 18, 21, // -Z 15, 12, 21, 14, 23, 11, // +Y 14, 2, 11, 5, 8, 20, // -Y 5, 17, 20, 10, 22, 19, // +X 10, 7, 19, 1, 13, 16, // -X 1, 4, 16 }; static const Scalar TexCoords[] = { 0.995f, 0.005f, // A+Z 0.005f, 0.995f, // A-Y 0.995f, 0.005f, // A-X 0.005f, 0.005f, // B+Z 0.995f, 0.995f, // B-Y 0.005f, 0.005f, // B+X 0.005f, 0.995f, // C+Z 0.995f, 0.005f, // C+Y 0.005f, 0.995f, // C+X 0.995f, 0.995f, // D+Z 0.005f, 0.005f, // D+Y 0.995f, 0.995f, // D-X 0.005f, 0.005f, // E-Z 0.005f, 0.005f, // E-Y 0.005f, 0.005f, // E-X 0.995f, 0.005f, // F-Z 0.995f, 0.005f, // F-Y 0.995f, 0.005f, // F+X 0.995f, 0.995f, // G-Z 0.995f, 0.995f, // G+Y 0.995f, 0.995f, // G+X 0.005f, 0.995f, // H-Z 0.005f, 0.995f, // H+Y 0.005f, 0.995f // H-X }; static const Scalar Positions[] = { -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, +0.5f, +0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, +0.5f, -0.5f }; Cube* C = new Cube; if(C->CreateBuffers() != BGE_SUCCESS) { delete C; return NULL; } C->SetPositionData(24, Positions); C->SetNormalData(24, Normals); C->SetTexCoordData(24, TexCoords); C->SetIndexData(36, Indices); C->Unbind(); return C; }
Cube* Cube::Create(Scalar Length, Scalar Width, Scalar Height) { Cube* C = new Cube; if(C->CreateBuffers() != BGE_SUCCESS) { delete C; return NULL; } /* So following changes affect our cube's VAO */ C->BindVAO(); /* * * A cube has 6 faces, each composed of two triangles. * We only need 8 vertices (3 components for each vertex, 24 buffer size) * The indices buffer will create our triangles * */ C->NumFaces = 6; C->NumVertices = 4 * 6; /* 4 vertices per face */ C->NumIndices = 36; /* 2 triangles per face, 3 vertices per triangle */ Scalar* Vertices = new Scalar[72]; Scalar* Normals = new Scalar[72]; Scalar* TexCoords = new Scalar[48]; unsigned int* Indices = new unsigned int[36]; /* * * H__________G * /| /| * D/_|_______C/ | +Y HEIGHT * | | | | | MODEL COORDINATE * | | | | | * | |E______|__|F |_____ +X WIDTH * | / | / / * |/_________|/ / * A B +Z LENGTH * * Each of A through H corresponds to 3 separate vertices. * They are separate so normals can be constant across each * of the cube's faces. * * e.g. A corresponds to vertices A+Z, A-Y and A-X * * Texcoords * Z and X faces: When the face normal is pointing towards you and * the Y axis pointing up, texcoords are as follows * BL 0, 0 BR 1, 0 * TL 0, 1 TR 1, 1 * * e.g. +Z face: * A 0, 0 * B 1, 0 * D 0, 1 * C 1, 1 * * Y faces: * +Y: * D 0, 0 * C 1, 0 * H 0, 1 * G 1, 1 * * -Y: * E 0, 0 * F 1, 0 * A 0, 1 * B 1, 1 * */ /* * * Convenience. Dimensions are full edge measurements and the cube is * formed around the origin (0, 0, 0) anyways * */ Width /= 2; Length /= 2; Height /= 2; memset((void*)Normals, 0, sizeof(Normals[0]) * 72); memset((void*)TexCoords, 0, sizeof(TexCoords[0]) * 48); /* +Z */ Indices[0] = 0; Indices[1] = 9; Indices[2] = 6; Indices[3] = 0; Indices[4] = 3; Indices[5] = 6; /* -Z */ Indices[6] = 15; Indices[7] = 18; Indices[8] = 21; Indices[9] = 15; Indices[10] = 12; Indices[11] = 21; /* -X */ Indices[12] = 14; Indices[13] = 23; Indices[14] = 11; Indices[15] = 14; Indices[16] = 2; Indices[17] = 11; /* +X */ Indices[18] = 5; Indices[19] = 8; Indices[20] = 20; Indices[21] = 5; Indices[22] = 17; Indices[23] = 20; /* +Y */ Indices[24] = 10; Indices[25] = 22; Indices[26] = 19; Indices[27] = 10; Indices[28] = 7; Indices[29] = 19; /* -Y */ Indices[30] = 1; Indices[31] = 13; Indices[32] = 16; Indices[33] = 1; Indices[34] = 4; Indices[35] = 16; /* A+Z */ Vertices[0] = -Width; Vertices[1] = -Height; Vertices[2] = +Length; Normals[2] = +1.0f; /* A-Y */ Vertices[3] = -Width; Vertices[4] = -Height; Vertices[5] = +Length; Normals[4] = -1.0f; TexCoords[3] = 1; /* A-X */ Vertices[6] = -Width; Vertices[7] = -Height; Vertices[8] = +Length; Normals[6] = -1.0f; TexCoords[4] = 1; /* B+Z */ Vertices[9] = +Width; Vertices[10] = -Height; Vertices[11] = +Length; Normals[11] = +1.0f; TexCoords[6] = 1; /* B-Y */ Vertices[12] = +Width; Vertices[13] = -Height; Vertices[14] = +Length; Normals[13] = -1.0f; TexCoords[8] = 1; TexCoords[9] = 1; /* B+X */ Vertices[15] = +Width; Vertices[16] = -Height; Vertices[17] = +Length; Normals[15] = + 1.0f; /* C+Z */ Vertices[18] = +Width; Vertices[19] = +Height; Vertices[20] = +Length; Normals[20] = +1.0f; TexCoords[12] = 1; TexCoords[13] = 1; /* C+Y */ Vertices[21] = +Width; Vertices[22] = +Height; Vertices[23] = +Length; Normals[22] = + 1.0f; TexCoords[14] = 1; /* C+X */ Vertices[24] = +Width; Vertices[25] = +Height; Vertices[26] = +Length; Normals[24] = +1.0f; TexCoords[17] = 1; /* D+Z */ Vertices[27] = -Width; Vertices[28] = +Height; Vertices[29] = +Length; Normals[29] = +1.0f; TexCoords[19] = 1; /* D+Y */ Vertices[30] = -Width; Vertices[31] = +Height; Vertices[32] = +Length; Normals[31] = +1.0f; /* D-X */ Vertices[33] = -Width; Vertices[34] = +Height; Vertices[35] = +Length; Normals[33] = -1.0f; TexCoords[22] = 1; TexCoords[23] = 1; /* E-Z */ Vertices[36] = -Width; Vertices[37] = -Height; Vertices[38] = -Length; Normals[38] = -1.0f; TexCoords[24] = 1; /* E-Y */ Vertices[39] = -Width; Vertices[40] = -Height; Vertices[41] = -Length; Normals[40] = -1.0f; /* E-X */ Vertices[42] = -Width; Vertices[43] = -Height; Vertices[44] = -Length; Normals[42] = -1.0f; /* F-Z */ Vertices[45] = +Width; Vertices[46] = -Height; Vertices[47] = -Length; Normals[47] = -1.0f; /* F-Y */ Vertices[48] = +Width; Vertices[49] = -Height; Vertices[50] = -Length; Normals[49] = -1.0f; TexCoords[32] = 1; /* F+X */ Vertices[51] = +Width; Vertices[52] = -Height; Vertices[53] = -Length; Normals[51] = +1.0f; TexCoords[34] = 1; /* G-Z */ Vertices[54] = +Width; Vertices[55] = +Height; Vertices[56] = -Length; Normals[56] = -1.0f; TexCoords[37] = 1; /* G+Y */ Vertices[57] = +Width; Vertices[58] = +Height; Vertices[59] = -Length; Normals[58] = +1.0f; TexCoords[38] = 1; TexCoords[39] = 1; /* G+X */ Vertices[60] = +Width; Vertices[61] = +Height; Vertices[62] = -Length; Normals[60] = +1.0f; TexCoords[40] = 1; TexCoords[41] = 1; /* H-Z */ Vertices[63] = -Width; Vertices[64] = +Height; Vertices[65] = -Length; Normals[65] = -1.0f; TexCoords[42] = 1; TexCoords[43] = 1; /* H+Y */ Vertices[66] = -Width; Vertices[67] = +Height; Vertices[68] = -Length; Normals[67] = +1.0f; TexCoords[45] = 1; /* H-X */ Vertices[69] = -Width; Vertices[70] = +Height; Vertices[71] = -Length; Normals[69] = -1.0f; TexCoords[47] = 1; glBindBuffer(GL_ARRAY_BUFFER, C->MeshBuffers[MESH_BUFFER_POSITIONS]); glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices[0]) * 72, Vertices, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, C->MeshBuffers[MESH_BUFFER_NORMALS]); glBufferData(GL_ARRAY_BUFFER, sizeof(Normals[0]) * 72, Normals, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, C->MeshBuffers[MESH_BUFFER_TEXCOORDS]); glBufferData(GL_ARRAY_BUFFER, sizeof(TexCoords[0]) * 48, TexCoords, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, C->MeshBuffers[MESH_BUFFER_INDICES]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices[0]) * 36, Indices, GL_STATIC_DRAW); C->Unbind(); delete[] Vertices; delete[] Normals; delete[] Indices; delete[] TexCoords; return C; }