/*----------------------------------------------------------------------------------------------- Description: Governs window creation, the initial OpenGL configuration (face culling, depth mask, even though this is a 2D demo and that stuff won't be of concern), the creation of geometry, and the creation of a texture. Parameters: argc (From main(...)) The number of char * items in argv. For glut's initialization. argv (From main(...)) A collection of argument strings. For glut's initialization. Returns: False if something went wrong during initialization, otherwise true; Exception: Safe Creator: John Cox (3-7-2016) -----------------------------------------------------------------------------------------------*/ void Init() { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CCW); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); glDepthFunc(GL_LEQUAL); glDepthRange(0.0f, 1.0f); gProgramId = GenerateShaderProgram(); gUnifMatrixTransform = glGetUniformLocation(gProgramId, "translateMatrixWindowSpace"); gUnifTextureSampler = glGetUniformLocation(gProgramId, "tex"); GenerateTriangle(&gTriangle); GenerateBox(&gBox); GenerateCircle(&gCircle); InitializeGeometry(gProgramId, &gTriangle); InitializeGeometry(gProgramId, &gBox); InitializeGeometry(gProgramId, &gCircle); gTexture1Id = CreateRandom3BeamTexture(); gTexture2Id = CreateRandom3BeamTexture(); gTexture3Id = CreateRandom3BeamTexture(); // the textures all share the same properties, so I'll use the same sampler for all gSamplerId = CreateGenericSampler(); }
SubMesh* Mesh::BuildSubMesh(const Primitive& primitive, const MeshParams& params) { #if NAZARA_UTILITY_SAFE if (!m_impl) { NazaraError("Mesh not created"); return nullptr; } if (m_impl->animationType != AnimationType_Static) { NazaraError("Mesh must be static"); return nullptr; } if (!params.IsValid()) { NazaraError("Parameters must be valid"); return nullptr; } #endif Boxf aabb; IndexBufferRef indexBuffer; VertexBufferRef vertexBuffer; Matrix4f matrix(primitive.matrix); matrix.ApplyScale(params.scale); VertexDeclaration* declaration = VertexDeclaration::Get(VertexLayout_XYZ_Normal_UV_Tangent); switch (primitive.type) { case PrimitiveType_Box: { unsigned int indexCount; unsigned int vertexCount; ComputeBoxIndexVertexCount(primitive.box.subdivision, &indexCount, &vertexCount); indexBuffer = IndexBuffer::New(vertexCount > std::numeric_limits<UInt16>::max(), indexCount, params.storage, BufferUsage_Static); vertexBuffer = VertexBuffer::New(declaration, vertexCount, params.storage, BufferUsage_Static); VertexMapper vertexMapper(vertexBuffer, BufferAccess_WriteOnly); VertexPointers pointers; pointers.normalPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Normal); pointers.positionPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Position); pointers.tangentPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent); pointers.uvPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord); IndexMapper indexMapper(indexBuffer, BufferAccess_WriteOnly); GenerateBox(primitive.box.lengths, primitive.box.subdivision, matrix, primitive.textureCoords, pointers, indexMapper.begin(), &aabb); break; } case PrimitiveType_Cone: { unsigned int indexCount; unsigned int vertexCount; ComputeConeIndexVertexCount(primitive.cone.subdivision, &indexCount, &vertexCount); indexBuffer = IndexBuffer::New(vertexCount > std::numeric_limits<UInt16>::max(), indexCount, params.storage, BufferUsage_Static); vertexBuffer = VertexBuffer::New(declaration, vertexCount, params.storage, BufferUsage_Static); VertexMapper vertexMapper(vertexBuffer, BufferAccess_WriteOnly); VertexPointers pointers; pointers.normalPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Normal); pointers.positionPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Position); pointers.tangentPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent); pointers.uvPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord); IndexMapper indexMapper(indexBuffer, BufferAccess_WriteOnly); GenerateCone(primitive.cone.length, primitive.cone.radius, primitive.cone.subdivision, matrix, primitive.textureCoords, pointers, indexMapper.begin(), &aabb); break; } case PrimitiveType_Plane: { unsigned int indexCount; unsigned int vertexCount; ComputePlaneIndexVertexCount(primitive.plane.subdivision, &indexCount, &vertexCount); indexBuffer = IndexBuffer::New(vertexCount > std::numeric_limits<UInt16>::max(), indexCount, params.storage, BufferUsage_Static); vertexBuffer = VertexBuffer::New(declaration, vertexCount, params.storage, BufferUsage_Static); VertexMapper vertexMapper(vertexBuffer, BufferAccess_WriteOnly); VertexPointers pointers; pointers.normalPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Normal); pointers.positionPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Position); pointers.tangentPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent); pointers.uvPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord); IndexMapper indexMapper(indexBuffer, BufferAccess_WriteOnly); GeneratePlane(primitive.plane.subdivision, primitive.plane.size, matrix, primitive.textureCoords, pointers, indexMapper.begin(), &aabb); break; } case PrimitiveType_Sphere: { switch (primitive.sphere.type) { case SphereType_Cubic: { unsigned int indexCount; unsigned int vertexCount; ComputeCubicSphereIndexVertexCount(primitive.sphere.cubic.subdivision, &indexCount, &vertexCount); indexBuffer = IndexBuffer::New(vertexCount > std::numeric_limits<UInt16>::max(), indexCount, params.storage, BufferUsage_Static); vertexBuffer = VertexBuffer::New(declaration, vertexCount, params.storage, BufferUsage_Static); VertexMapper vertexMapper(vertexBuffer, BufferAccess_ReadWrite); VertexPointers pointers; pointers.normalPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Normal); pointers.positionPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Position); pointers.tangentPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent); pointers.uvPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord); IndexMapper indexMapper(indexBuffer, BufferAccess_WriteOnly); GenerateCubicSphere(primitive.sphere.size, primitive.sphere.cubic.subdivision, matrix, primitive.textureCoords, pointers, indexMapper.begin(), &aabb); break; } case SphereType_Ico: { unsigned int indexCount; unsigned int vertexCount; ComputeIcoSphereIndexVertexCount(primitive.sphere.ico.recursionLevel, &indexCount, &vertexCount); indexBuffer = IndexBuffer::New(vertexCount > std::numeric_limits<UInt16>::max(), indexCount, params.storage, BufferUsage_Static); vertexBuffer = VertexBuffer::New(declaration, vertexCount, params.storage, BufferUsage_Static); VertexMapper vertexMapper(vertexBuffer, BufferAccess_WriteOnly); VertexPointers pointers; pointers.normalPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Normal); pointers.positionPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Position); pointers.tangentPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent); pointers.uvPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord); IndexMapper indexMapper(indexBuffer, BufferAccess_WriteOnly); GenerateIcoSphere(primitive.sphere.size, primitive.sphere.ico.recursionLevel, matrix, primitive.textureCoords, pointers, indexMapper.begin(), &aabb); break; } case SphereType_UV: { unsigned int indexCount; unsigned int vertexCount; ComputeUvSphereIndexVertexCount(primitive.sphere.uv.sliceCount, primitive.sphere.uv.stackCount, &indexCount, &vertexCount); indexBuffer = IndexBuffer::New(vertexCount > std::numeric_limits<UInt16>::max(), indexCount, params.storage, BufferUsage_Static); vertexBuffer = VertexBuffer::New(declaration, vertexCount, params.storage, BufferUsage_Static); VertexMapper vertexMapper(vertexBuffer, BufferAccess_WriteOnly); VertexPointers pointers; pointers.normalPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Normal); pointers.positionPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Position); pointers.tangentPtr = vertexMapper.GetComponentPtr<Vector3f>(VertexComponent_Tangent); pointers.uvPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent_TexCoord); IndexMapper indexMapper(indexBuffer, BufferAccess_WriteOnly); GenerateUvSphere(primitive.sphere.size, primitive.sphere.uv.sliceCount, primitive.sphere.uv.stackCount, matrix, primitive.textureCoords, pointers, indexMapper.begin(), &aabb); break; } } break; } } StaticMeshRef subMesh = StaticMesh::New(this); if (!subMesh->Create(vertexBuffer)) { NazaraError("Failed to create StaticMesh"); return nullptr; } if (params.optimizeIndexBuffers) indexBuffer->Optimize(); subMesh->SetAABB(aabb); subMesh->SetIndexBuffer(indexBuffer); AddSubMesh(subMesh); return subMesh; }