diff --git a/miniwin/src/d3drm/backends/opengl15/renderer.cpp b/miniwin/src/d3drm/backends/opengl15/renderer.cpp index 4056fda5..aeef8e1b 100644 --- a/miniwin/src/d3drm/backends/opengl15/renderer.cpp +++ b/miniwin/src/d3drm/backends/opengl15/renderer.cpp @@ -37,6 +37,9 @@ Direct3DRMRenderer* OpenGL15Renderer::Create(DWORD width, DWORD height) return nullptr; } + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CCW); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); @@ -316,6 +319,8 @@ void OpenGL15Renderer::SubmitDraw( glLoadMatrixf(&mvMatrix[0][0]); glEnable(GL_NORMALIZE); + glColor4ub(appearance.color.r, appearance.color.g, appearance.color.b, appearance.color.a); + // Bind texture if present if (appearance.textureId != NO_TEXTURE_ID) { auto& tex = m_textures[appearance.textureId]; @@ -342,7 +347,6 @@ void OpenGL15Renderer::SubmitDraw( glBegin(GL_TRIANGLES); for (size_t i = 0; i < count; i++) { const GeometryVertex& v = vertices[i]; - glColor4ub(appearance.color.r, appearance.color.g, appearance.color.b, appearance.color.a); glNormal3f(v.normals.x, v.normals.y, v.normals.z); glTexCoord2f(v.texCoord.u, v.texCoord.v); glVertex3f(v.position.x, v.position.y, v.position.z); diff --git a/miniwin/src/d3drm/d3drmmesh.cpp b/miniwin/src/d3drm/d3drmmesh.cpp index e487629e..de651797 100644 --- a/miniwin/src/d3drm/d3drmmesh.cpp +++ b/miniwin/src/d3drm/d3drmmesh.cpp @@ -64,8 +64,6 @@ HRESULT Direct3DRMMeshImpl::AddGroup( m_groups.push_back(std::move(group)); - UpdateBox(newIndex); - return DD_OK; } @@ -281,19 +279,14 @@ void Direct3DRMMeshImpl::UpdateBox() m_box.max = {-INF, -INF, -INF}; for (size_t i = 0; i < m_groups.size(); ++i) { - UpdateBox(i); - } -} - -void Direct3DRMMeshImpl::UpdateBox(DWORD groupIndex) -{ - for (const D3DRMVERTEX& v : m_groups[groupIndex].vertices) { - m_box.min.x = std::min(m_box.min.x, v.position.x); - m_box.min.y = std::min(m_box.min.y, v.position.y); - m_box.min.z = std::min(m_box.min.z, v.position.z); - m_box.max.x = std::max(m_box.max.x, v.position.x); - m_box.max.y = std::max(m_box.max.y, v.position.y); - m_box.max.z = std::max(m_box.max.z, v.position.z); + for (const D3DRMVERTEX& v : m_groups[i].vertices) { + m_box.min.x = std::min(m_box.min.x, v.position.x); + m_box.min.y = std::min(m_box.min.y, v.position.y); + m_box.min.z = std::min(m_box.min.z, v.position.z); + m_box.max.x = std::max(m_box.max.x, v.position.x); + m_box.max.y = std::max(m_box.max.y, v.position.y); + m_box.max.z = std::max(m_box.max.z, v.position.z); + } } } diff --git a/miniwin/src/d3drm/d3drmviewport.cpp b/miniwin/src/d3drm/d3drmviewport.cpp index 9e715f17..9c731f7f 100644 --- a/miniwin/src/d3drm/d3drmviewport.cpp +++ b/miniwin/src/d3drm/d3drmviewport.cpp @@ -212,7 +212,13 @@ bool IsBoxInFrustum(const D3DVECTOR corners[8], const Plane planes[6]) return true; } -void Direct3DRMViewportImpl::CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3DRMMATRIX4D parentMatrix) +void Direct3DRMViewportImpl::CollectMeshesFromFrame( + IDirect3DRMFrame* frame, + D3DRMMATRIX4D parentMatrix, + std::vector& verts, + std::vector& d3dVerts, + std::vector& faces +) { Direct3DRMFrameImpl* frameImpl = static_cast(frame); D3DRMMATRIX4D localMatrix; @@ -234,7 +240,7 @@ void Direct3DRMViewportImpl::CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3D IDirect3DRMFrame* childFrame = nullptr; visual->QueryInterface(IID_IDirect3DRMFrame, (void**) &childFrame); if (childFrame) { - CollectMeshesFromFrame(childFrame, worldMatrix); + CollectMeshesFromFrame(childFrame, worldMatrix, verts, d3dVerts, faces); childFrame->Release(); visual->Release(); continue; @@ -273,9 +279,12 @@ void Direct3DRMViewportImpl::CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3D DWORD vtxCount, faceCount, vpf, dataSize; mesh->GetGroup(gi, &vtxCount, &faceCount, &vpf, &dataSize, nullptr); - std::vector verts(dataSize * vpf); - std::vector d3dVerts(vtxCount); - std::vector faces(dataSize); + verts.reserve(dataSize); + verts.clear(); + d3dVerts.resize(vtxCount); + d3dVerts.clear(); + faces.resize(dataSize); + faces.clear(); mesh->GetVertices(gi, 0, vtxCount, d3dVerts.data()); mesh->GetGroup(gi, nullptr, nullptr, nullptr, nullptr, faces.data()); @@ -356,8 +365,11 @@ HRESULT Direct3DRMViewportImpl::RenderScene() return status; } + std::vector verts; + std::vector d3dVerts; + std::vector faces; ExtractFrustumPlanes(viewProj); - CollectMeshesFromFrame(m_rootFrame, identity); + CollectMeshesFromFrame(m_rootFrame, identity, verts, d3dVerts, faces); return m_renderer->FinalizeFrame(); } diff --git a/miniwin/src/internal/d3drmmesh_impl.h b/miniwin/src/internal/d3drmmesh_impl.h index 16e02087..d893e145 100644 --- a/miniwin/src/internal/d3drmmesh_impl.h +++ b/miniwin/src/internal/d3drmmesh_impl.h @@ -94,7 +94,6 @@ struct Direct3DRMMeshImpl : public Direct3DRMObjectBaseImpl { private: void UpdateBox(); - void UpdateBox(DWORD groupIndex); std::vector m_groups; D3DRMBOX m_box; diff --git a/miniwin/src/internal/d3drmviewport_impl.h b/miniwin/src/internal/d3drmviewport_impl.h index 1d996d0d..3a5a244b 100644 --- a/miniwin/src/internal/d3drmviewport_impl.h +++ b/miniwin/src/internal/d3drmviewport_impl.h @@ -37,7 +37,13 @@ struct Direct3DRMViewportImpl : public Direct3DRMObjectBaseImpl& lights); - void CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3DRMMATRIX4D parentMatrix); + void CollectMeshesFromFrame( + IDirect3DRMFrame* frame, + D3DRMMATRIX4D parentMatrix, + std::vector& verts, + std::vector& d3dVerts, + std::vector& faces + ); void UpdateProjectionMatrix(); Direct3DRMRenderer* m_renderer; D3DCOLOR m_backgroundColor = 0xFF000000;