diff --git a/LEGO1/tgl/d3drm/impl.h b/LEGO1/tgl/d3drm/impl.h index a162e175..662a33e8 100644 --- a/LEGO1/tgl/d3drm/impl.h +++ b/LEGO1/tgl/d3drm/impl.h @@ -99,6 +99,7 @@ class RendererImpl : public Renderer { const RendererDataType& ImplementationData() const { return m_data; } + // FUNCTION: BETA10 0x10174c10 RendererDataType& ImplementationData() { return m_data; } public: @@ -115,6 +116,18 @@ class RendererImpl : public Renderer { ViewImpl& rView ); inline Result CreateMeshBuilder(MeshBuilderImpl& rMesh); + inline Result CreateCamera(CameraImpl& rCamera); + inline Result CreateTexture(TextureImpl& rTexture); + inline Result CreateTexture( + TextureImpl& rTexture, + int width, + int height, + int bitsPerTexel, + const void* pTexels, + int texelsArePersistent, + int paletteEntryCount, + const PaletteEntry* pEntries + ); private: RendererDataType m_data; diff --git a/LEGO1/tgl/d3drm/renderer.cpp b/LEGO1/tgl/d3drm/renderer.cpp index a275825a..72c61a0d 100644 --- a/LEGO1/tgl/d3drm/renderer.cpp +++ b/LEGO1/tgl/d3drm/renderer.cpp @@ -190,14 +190,33 @@ Group* RendererImpl::CreateGroup(const Group* pParent) return group; } +// FUNCTION: BETA10 0x1016d4b0 +inline Result RendererCreateCamera(IDirect3DRM2* pD3DRM, IDirect3DRMFrame2*& rpCamera) +{ + return ResultVal(pD3DRM->CreateFrame(NULL, &rpCamera)); +} + +// FUNCTION: BETA10 0x1016d420 +inline Result RendererImpl::CreateCamera(CameraImpl& rCamera) +{ + assert(m_data); + assert(!rCamera.ImplementationData()); + + return RendererCreateCamera(m_data, rCamera.ImplementationData()); +} + // FUNCTION: LEGO1 0x100a1c30 +// FUNCTION: BETA10 0x1016a980 Camera* RendererImpl::CreateCamera() { + assert(m_data); CameraImpl* camera = new CameraImpl(); - if (FAILED(m_data->CreateFrame(NULL, &camera->m_data))) { + + if (!CreateCamera(*camera)) { delete camera; camera = NULL; } + return camera; } @@ -309,39 +328,76 @@ MeshBuilder* RendererImpl::CreateMeshBuilder() return meshBuilder; } +// FUNCTION: BETA10 0x1016d9c0 inline Result RendererCreateTexture( - IDirect3DRM2* renderer, - IDirect3DRMTexture*& texture, + IDirect3DRM2* pRenderer, int width, int height, int bytesPerPixel, void* pBuffer, int useBuffer, int paletteSize, - PaletteEntry* pEntries + PaletteEntry* pEntries, + IDirect3DRMTexture*& rpTexture ) { - TglD3DRMIMAGE* image; Result result; - image = new TglD3DRMIMAGE(width, height, bytesPerPixel, pBuffer, useBuffer, paletteSize, pEntries); + TglD3DRMIMAGE* pImage = new TglD3DRMIMAGE(width, height, bytesPerPixel, pBuffer, useBuffer, paletteSize, pEntries); + assert(pImage); + // TODO: LPDIRECT3DRMTEXTURE2? - result = ResultVal(renderer->CreateTexture(&image->m_image, (LPDIRECT3DRMTEXTURE2*) &texture)); + result = ResultVal(pRenderer->CreateTexture(&pImage->m_image, (LPDIRECT3DRMTEXTURE2*) &rpTexture)); + assert(Succeeded(result)); + assert((rpTexture->AddRef(), rpTexture->Release()) == 1); + if (Succeeded(result)) { - result = TextureImpl::SetImage(texture, image); + result = TextureImpl::SetImage(rpTexture, pImage); + assert(Succeeded(result)); + if (!Succeeded(result)) { - texture->Release(); - texture = NULL; - delete image; + rpTexture->Release(); + rpTexture = NULL; + delete pImage; } } else { - delete image; + delete pImage; } + return result; } +// FUNCTION: BETA10 0x1016d910 +inline Result RendererImpl::CreateTexture( + TextureImpl& rTexture, + int width, + int height, + int bitsPerTexel, + const void* pTexels, + int texelsArePersistent, + int paletteEntryCount, + const PaletteEntry* pEntries +) +{ + assert(m_data); + assert(!rTexture.ImplementationData()); + + return RendererCreateTexture( + m_data, + width, + height, + bitsPerTexel, + const_cast(pTexels), + texelsArePersistent, + paletteEntryCount, + const_cast(pEntries), + rTexture.ImplementationData() + ); +} + // FUNCTION: LEGO1 0x100a1f50 +// FUNCTION: BETA10 0x1016ad00 Texture* RendererImpl::CreateTexture( int width, int height, @@ -352,10 +408,11 @@ Texture* RendererImpl::CreateTexture( const PaletteEntry* pEntries ) { + assert(m_data); + TextureImpl* texture = new TextureImpl(); - if (!Succeeded(RendererCreateTexture( - m_data, - texture->m_data, + if (!CreateTexture( + *texture, width, height, bitsPerTexel, @@ -363,21 +420,40 @@ Texture* RendererImpl::CreateTexture( texelsArePersistent, paletteEntryCount, const_cast(pEntries) - ))) { + )) { delete texture; texture = NULL; } return texture; } +// FUNCTION: BETA10 0x1016dcb0 +inline Result RendererCreateTexture(IDirect3DRM2* pRenderer, IDirect3DRMTexture*& rpTexture) +{ + return RendererCreateTexture(pRenderer, 0, 0, 0, NULL, FALSE, 0, NULL, rpTexture); +} + +// FUNCTION: BETA10 0x1016dc20 +inline Result RendererImpl::CreateTexture(TextureImpl& rTexture) +{ + assert(m_data); + assert(!rTexture.ImplementationData()); + + return RendererCreateTexture(m_data, rTexture.ImplementationData()); +} + // FUNCTION: LEGO1 0x100a20d0 +// FUNCTION: BETA10 0x1016ae20 Texture* RendererImpl::CreateTexture() { + assert(m_data); + TextureImpl* texture = new TextureImpl(); - if (!Succeeded(RendererCreateTexture(m_data, texture->m_data, 0, 0, 0, NULL, FALSE, 0, NULL))) { + if (!CreateTexture(*texture)) { delete texture; texture = NULL; } + return texture; }