//TODO: drive this with a generic VBO descriptor to avoid special case drawing like these particles static void DrawParticles( const DrawParticlesCommand &cmd ) { if ( !cmd.material ) { console.Print( PrintLevel::Developer, "%s with invalid material\n", XS_FUNCTION ); return; } cmd.material->Bind(); bool setWireframe = false; bool previousWireframe = false; if ( r_wireframe->GetBool() || (cmd.material->flags & MF_WIREFRAME) ) { setWireframe = true; previousWireframe = GetWireframe(); ToggleWireframe( true ); } if ( cmd.vbo ) { cmd.vbo->Bind(); // position4, uv2, colour4 EnableVertexAttribs( VERTEX_ATTRIB_0 | VERTEX_ATTRIB_1 | VERTEX_ATTRIB_2 ); // calculate stride GLsizei stride = sizeof(vector4) + sizeof(vector2) + sizeof(vector4); // set the attribute pointers size_t offset = 0u; glVertexAttribPointer( 0, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) ); offset += sizeof(vector4); glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) ); offset += sizeof(vector2); glVertexAttribPointer( 2, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) ); offset += sizeof(vector4); } if ( 1 ) { cmd.ibo->Bind(); GLint size = 0; glGetBufferParameteriv( GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size ); glDrawElements( GL_TRIANGLES, size / sizeof(uint32_t), GL_UNSIGNED_INT, 0 ); } else { glDrawArrays( GL_TRIANGLES, 0, cmd.count ); } // clean up state if ( setWireframe ) { ToggleWireframe( previousWireframe ); } }
void StateRenderTest::Update(beStateMachine* stateMachine, float dt) { auto gamepad = m_appData->gamepad; auto keyboard = m_appData->keyboard; auto mouse = m_appData->mouse; auto renderInterface = m_appData->renderInterface; if (gamepad->GetPressed(beGamepad::A) || keyboard->IsPressed(beKeyboard::Button::W)) { renderInterface->ToggleWireframe(); } if (keyboard->IsPressed(beKeyboard::Button::G)) { m_renderGrid = !m_renderGrid; } if (keyboard->IsPressed(beKeyboard::Button::F)) { m_showGroundFilled = !m_showGroundFilled; m_gridModel.SetMeshVisibility("GroundFilled", m_showGroundFilled); } if (gamepad->GetPressed(beGamepad::B) || keyboard->IsPressed(beKeyboard::Button::Escape)) { stateMachine->ChangeState(nullptr); return; } if (gamepad->GetPressed(beGamepad::Y)) { const int shader = ((int)m_shaderToUse + 1) % (int)beRendering::ShaderType::Count; m_shaderToUse = (beRendering::ShaderType)shader; } if (gamepad->GetPressed(beGamepad::X) || mouse->IsPressed(beMouse::Button::MiddleButton)) { m_modelToUse++; m_modelToUse %= m_models.Count() + 1; } if (gamepad->GetPressed(beGamepad::Select)) { m_renderAxes = !m_renderAxes; } if (gamepad->GetPressed(beGamepad::Up)) { m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() + Vec2(0.f, 0.1f)); m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() + Vec2(0.f, 20.f)); } if (gamepad->GetPressed(beGamepad::Down)) { m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() - Vec2(0.f, 0.1f)); m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() - Vec2(0.f, 20.f)); } if (gamepad->GetPressed(beGamepad::Left)) { m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() - Vec2(0.1f, 0.f)); m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() - Vec2(20.f, 0.f)); } if (gamepad->GetPressed(beGamepad::Right)) { m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() + Vec2(0.1f, 0.f)); m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() + Vec2(20.f, 0.f)); } if (mouse->IsPressed(beMouse::LeftButton)) { //auto window = m_appData->window; const float screenX = (float)mouse->GetX();// -window->GetX(); const float screenY = (float)mouse->GetY();// - window->GetY(); Vec3 worldPos, worldDir; const bool isInBounds = beCameraUtils::GetScreeenToWorldRay(*renderInterface, m_camera.GetViewMatrix(), screenX, screenY, &worldPos, &worldDir); if (isInBounds) { //LOG("MOUSE CLICK: (%.2f, %.2f) POS:{%3.3f, %3.3f, %3.3f} dir:{%3.3f, %3.3f, %3.3f}\r\n", screenX, screenY, worldPos.x, worldPos.y, worldPos.z, worldDir.x, worldDir.y, worldDir.z); //LOG("MOUSE Deets:"); PositionFromMatrix(m_camera.GetViewMatrix()); } //if (auto realWorldPos = beCameraUtils::WorldPosFromScreenPos(*renderInterface, m_camera.GetViewMatrix(), m_camera.GetPosition(), screenX, screenY)) //{ // LOG("Collision! mouse pos:{%.3f, %.3f, %.3f} World collision at:{%3.3f, %3.3f, %3.3f}\r\n", m_camera.GetPosition().x, m_camera.GetPosition().y, m_camera.GetPosition().z, realWorldPos->x, realWorldPos->y, realWorldPos->z); //} } m_camera.Update(dt); }
static void DrawMesh( const Mesh *mesh ) { SDL_assert( mesh->material && "DrawMesh with invalid material" ); bool setWireframe = false; bool previousWireframe = false; if ( r_wireframe->GetBool() || (mesh->material->flags & MF_WIREFRAME) ) { setWireframe = true; previousWireframe = GetWireframe(); ToggleWireframe( true ); } // bind the vertex/normal/uv buffers if ( mesh->vertexBuffer ) { const bool hasVerts = !mesh->vertices.empty(); const bool hasNormals = !mesh->normals.empty(); const bool hasUVs = !mesh->UVs.empty(); mesh->vertexBuffer->Bind(); uint32_t vertexAttribs = 0u; if ( hasVerts ) { vertexAttribs |= VERTEX_ATTRIB_0; } if ( hasNormals ) { vertexAttribs |= VERTEX_ATTRIB_1; } if ( hasUVs ) { vertexAttribs |= VERTEX_ATTRIB_2; } EnableVertexAttribs( vertexAttribs ); // calculate stride GLsizei stride = 0; if ( hasVerts ) { stride += sizeof(vector3); } if ( hasNormals ) { stride += sizeof(vector3); } if ( hasUVs ) { stride += sizeof(vector2); } // set the attribute pointers size_t offset = 0u; if ( hasVerts ) { glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) ); offset += sizeof(vector3); } if ( hasNormals ) { glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) ); offset += sizeof(vector3); } if ( hasUVs ) { glVertexAttribPointer( 2, 2, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) ); offset += sizeof(vector2); } } // issue the draw command //FIXME: index buffer is all kinds of wrong when using glDrawElements if ( 0 ) {//mesh->indexBuffer ) { mesh->indexBuffer->Bind(); GLint size = 0; glGetBufferParameteriv( GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size ); glDrawElements( GL_TRIANGLES, size / sizeof(uint32_t), GL_UNSIGNED_INT, 0 ); } else { glDrawArrays( GL_TRIANGLES, 0, mesh->indices.size() ); } // clean up state if ( setWireframe ) { ToggleWireframe( previousWireframe ); } }