Merge branch 'master' into emscripten

This commit is contained in:
Christian Semmler 2025-06-05 18:29:03 -07:00 committed by GitHub
commit 8e30b767d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 24 deletions

View File

@ -37,6 +37,9 @@ Direct3DRMRenderer* OpenGL15Renderer::Create(DWORD width, DWORD height)
return nullptr; return nullptr;
} }
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL); glEnable(GL_COLOR_MATERIAL);
@ -316,6 +319,8 @@ void OpenGL15Renderer::SubmitDraw(
glLoadMatrixf(&mvMatrix[0][0]); glLoadMatrixf(&mvMatrix[0][0]);
glEnable(GL_NORMALIZE); glEnable(GL_NORMALIZE);
glColor4ub(appearance.color.r, appearance.color.g, appearance.color.b, appearance.color.a);
// Bind texture if present // Bind texture if present
if (appearance.textureId != NO_TEXTURE_ID) { if (appearance.textureId != NO_TEXTURE_ID) {
auto& tex = m_textures[appearance.textureId]; auto& tex = m_textures[appearance.textureId];
@ -342,7 +347,6 @@ void OpenGL15Renderer::SubmitDraw(
glBegin(GL_TRIANGLES); glBegin(GL_TRIANGLES);
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
const GeometryVertex& v = vertices[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); glNormal3f(v.normals.x, v.normals.y, v.normals.z);
glTexCoord2f(v.texCoord.u, v.texCoord.v); glTexCoord2f(v.texCoord.u, v.texCoord.v);
glVertex3f(v.position.x, v.position.y, v.position.z); glVertex3f(v.position.x, v.position.y, v.position.z);

View File

@ -64,8 +64,6 @@ HRESULT Direct3DRMMeshImpl::AddGroup(
m_groups.push_back(std::move(group)); m_groups.push_back(std::move(group));
UpdateBox(newIndex);
return DD_OK; return DD_OK;
} }
@ -281,13 +279,7 @@ void Direct3DRMMeshImpl::UpdateBox()
m_box.max = {-INF, -INF, -INF}; m_box.max = {-INF, -INF, -INF};
for (size_t i = 0; i < m_groups.size(); ++i) { for (size_t i = 0; i < m_groups.size(); ++i) {
UpdateBox(i); for (const D3DRMVERTEX& v : m_groups[i].vertices) {
}
}
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.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.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.min.z = std::min(m_box.min.z, v.position.z);
@ -295,6 +287,7 @@ void Direct3DRMMeshImpl::UpdateBox(DWORD groupIndex)
m_box.max.y = std::max(m_box.max.y, v.position.y); 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); m_box.max.z = std::max(m_box.max.z, v.position.z);
} }
}
} }
HRESULT Direct3DRMMeshImpl::GetBox(D3DRMBOX* box) HRESULT Direct3DRMMeshImpl::GetBox(D3DRMBOX* box)

View File

@ -212,7 +212,13 @@ bool IsBoxInFrustum(const D3DVECTOR corners[8], const Plane planes[6])
return true; return true;
} }
void Direct3DRMViewportImpl::CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3DRMMATRIX4D parentMatrix) void Direct3DRMViewportImpl::CollectMeshesFromFrame(
IDirect3DRMFrame* frame,
D3DRMMATRIX4D parentMatrix,
std::vector<GeometryVertex>& verts,
std::vector<D3DRMVERTEX>& d3dVerts,
std::vector<DWORD>& faces
)
{ {
Direct3DRMFrameImpl* frameImpl = static_cast<Direct3DRMFrameImpl*>(frame); Direct3DRMFrameImpl* frameImpl = static_cast<Direct3DRMFrameImpl*>(frame);
D3DRMMATRIX4D localMatrix; D3DRMMATRIX4D localMatrix;
@ -234,7 +240,7 @@ void Direct3DRMViewportImpl::CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3D
IDirect3DRMFrame* childFrame = nullptr; IDirect3DRMFrame* childFrame = nullptr;
visual->QueryInterface(IID_IDirect3DRMFrame, (void**) &childFrame); visual->QueryInterface(IID_IDirect3DRMFrame, (void**) &childFrame);
if (childFrame) { if (childFrame) {
CollectMeshesFromFrame(childFrame, worldMatrix); CollectMeshesFromFrame(childFrame, worldMatrix, verts, d3dVerts, faces);
childFrame->Release(); childFrame->Release();
visual->Release(); visual->Release();
continue; continue;
@ -273,9 +279,12 @@ void Direct3DRMViewportImpl::CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3D
DWORD vtxCount, faceCount, vpf, dataSize; DWORD vtxCount, faceCount, vpf, dataSize;
mesh->GetGroup(gi, &vtxCount, &faceCount, &vpf, &dataSize, nullptr); mesh->GetGroup(gi, &vtxCount, &faceCount, &vpf, &dataSize, nullptr);
std::vector<GeometryVertex> verts(dataSize * vpf); verts.reserve(dataSize);
std::vector<D3DRMVERTEX> d3dVerts(vtxCount); verts.clear();
std::vector<DWORD> faces(dataSize); d3dVerts.resize(vtxCount);
d3dVerts.clear();
faces.resize(dataSize);
faces.clear();
mesh->GetVertices(gi, 0, vtxCount, d3dVerts.data()); mesh->GetVertices(gi, 0, vtxCount, d3dVerts.data());
mesh->GetGroup(gi, nullptr, nullptr, nullptr, nullptr, faces.data()); mesh->GetGroup(gi, nullptr, nullptr, nullptr, nullptr, faces.data());
@ -356,8 +365,11 @@ HRESULT Direct3DRMViewportImpl::RenderScene()
return status; return status;
} }
std::vector<GeometryVertex> verts;
std::vector<D3DRMVERTEX> d3dVerts;
std::vector<DWORD> faces;
ExtractFrustumPlanes(viewProj); ExtractFrustumPlanes(viewProj);
CollectMeshesFromFrame(m_rootFrame, identity); CollectMeshesFromFrame(m_rootFrame, identity, verts, d3dVerts, faces);
return m_renderer->FinalizeFrame(); return m_renderer->FinalizeFrame();
} }

View File

@ -94,7 +94,6 @@ struct Direct3DRMMeshImpl : public Direct3DRMObjectBaseImpl<IDirect3DRMMesh> {
private: private:
void UpdateBox(); void UpdateBox();
void UpdateBox(DWORD groupIndex);
std::vector<MeshGroup> m_groups; std::vector<MeshGroup> m_groups;
D3DRMBOX m_box; D3DRMBOX m_box;

View File

@ -37,7 +37,13 @@ struct Direct3DRMViewportImpl : public Direct3DRMObjectBaseImpl<IDirect3DRMViewp
private: private:
HRESULT RenderScene(); HRESULT RenderScene();
void CollectLightsFromFrame(IDirect3DRMFrame* frame, D3DRMMATRIX4D parentMatrix, std::vector<SceneLight>& lights); void CollectLightsFromFrame(IDirect3DRMFrame* frame, D3DRMMATRIX4D parentMatrix, std::vector<SceneLight>& lights);
void CollectMeshesFromFrame(IDirect3DRMFrame* frame, D3DRMMATRIX4D parentMatrix); void CollectMeshesFromFrame(
IDirect3DRMFrame* frame,
D3DRMMATRIX4D parentMatrix,
std::vector<GeometryVertex>& verts,
std::vector<D3DRMVERTEX>& d3dVerts,
std::vector<DWORD>& faces
);
void UpdateProjectionMatrix(); void UpdateProjectionMatrix();
Direct3DRMRenderer* m_renderer; Direct3DRMRenderer* m_renderer;
D3DCOLOR m_backgroundColor = 0xFF000000; D3DCOLOR m_backgroundColor = 0xFF000000;