void PickingRenderer::_RenderMesh( BasicObject* tempObject ) { Transform* cameraTransform = _renderingCamera->transform; Camera* cameraComponent = _renderingCamera->camera; Material* material = tempObject->meshDrawing->GetMaterial(); Mesh* mesh = tempObject->meshDrawing->GetMesh(); if ( material == NULL || mesh == NULL ) return; Shader* shader = material->GetShader(); uint programID = shader->GetProgramID( E_ShadingType::Picking ); _gl->glUseProgram( programID ); _gl->glBindBuffer( GL_ARRAY_BUFFER, mesh->GetVertexBufferID() ); _gl->glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, mesh->GetIndexBufferID() ); _gl->glEnableVertexAttribArray(0); _gl->glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) (offsetof(Vertex, position)) ); int worldLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_world" ); int viewLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_view" ); int projectionLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_projection" ); int scaleMatLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_scaleMat" ); int rotationMatLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_rotationMat" ); int positionMatLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_positionMat" ); int camRotationMatLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_camRotationMat" ); int objectIndexLoc = shader->GetUniformLocation( E_ShadingType::Picking, "ME3D_uniqueIndex" ); Matrix4 worldMatrix = tempObject->transform->GetWorldMatrix(); Matrix4 viewMatrix = cameraTransform->GetViewMatrix(); Matrix4 projectionMatrix = cameraComponent->GetProjectionMatrix(); Matrix4 scaleMatrix = tempObject->transform->GetScaleMatrix(); Matrix4 rotationMatrix = tempObject->transform->GetRotationMatrix(); Matrix4 positionMatrix = tempObject->transform->GetPositionMatrix(); Matrix4 camRotationMatrix = cameraTransform->GetRotationMatrix(); _gl->glUniformMatrix4fv ( worldLoc, 1, GL_FALSE, worldMatrix.GetValuePtr() ); _gl->glUniformMatrix4fv ( viewLoc, 1, GL_FALSE, viewMatrix.GetValuePtr() ); _gl->glUniformMatrix4fv ( projectionLoc, 1, GL_FALSE, projectionMatrix.GetValuePtr() ); _gl->glUniformMatrix4fv ( scaleMatLoc, 1, GL_FALSE, scaleMatrix.GetValuePtr() ); _gl->glUniformMatrix4fv ( rotationMatLoc, 1, GL_FALSE, rotationMatrix.GetValuePtr() ); _gl->glUniformMatrix4fv ( positionMatLoc, 1, GL_FALSE, positionMatrix.GetValuePtr() ); _gl->glUniformMatrix4fv ( camRotationMatLoc, 1, GL_FALSE, camRotationMatrix.GetValuePtr() ); _gl->glUniform1i ( objectIndexLoc, tempObject->uniqueIndex ); if ( material->IsWireframe() ) { _gl->glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); _gl->glLineWidth( material->GetLineWidth() ); _gl->glDisable( GL_CULL_FACE ); } else { _gl->glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); if ( material->GetFaceCulling() == E_FaceCulling::CULL_NONE ) { _gl->glDisable( GL_CULL_FACE ); } else { _gl->glEnable(GL_CULL_FACE); if ( material->GetFaceCulling() == E_FaceCulling::CULL_BACK ) _gl->glCullFace( GL_BACK ); if ( material->GetFaceCulling() == E_FaceCulling::CULL_FRONT ) _gl->glCullFace( GL_FRONT ); } } if ( mesh->GetMeshType() == E_MeshType::POLYGON ) _gl->glDrawElements( GL_TRIANGLES, mesh->GetNumIndices(), GL_UNSIGNED_INT, 0 ); else _gl->glDrawElements( GL_LINES, mesh->GetNumIndices(), GL_UNSIGNED_INT, 0 ); // unbind _gl->glBindBuffer( GL_ARRAY_BUFFER, 0 ); _gl->glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); _gl->glUseProgram( 0 ); }