From d5aff8914be2feaffbbb47d214dd6024f2b8f384 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Thu, 23 Jul 2020 21:40:07 +0200 Subject: [PATCH 01/22] Refactored Constant Buffers --- .../Renderer/ConstantBuffer/ConstantBuffer.h | 34 +++++ TR5Main/Renderer/Renderer11.cpp | 25 ---- TR5Main/Renderer/Renderer11.h | 27 ++-- TR5Main/Renderer/Renderer11Draw.cpp | 133 +++++++++--------- TR5Main/Renderer/Renderer11Draw2D.cpp | 8 +- TR5Main/Renderer/Renderer11DrawEffect.cpp | 88 ++++++------ TR5Main/Renderer/Renderer11Init.cpp | 23 +-- TR5Main/Renderer/Renderer11Lara.cpp | 20 +-- TR5Main/TR5Main.vcxproj | 1 + TR5Main/TR5Main.vcxproj.filters | 3 + 10 files changed, 190 insertions(+), 172 deletions(-) create mode 100644 TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h diff --git a/TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h b/TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h new file mode 100644 index 000000000..7841db687 --- /dev/null +++ b/TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h @@ -0,0 +1,34 @@ +#pragma once +#include +#include "Utils.h" +#include "debug/debug.h" +namespace T5M::Renderer { + template + class ConstantBuffer { + ComPtr buffer; + + public: + ConstantBuffer() = default; + ConstantBuffer(ID3D11Device* device) { + D3D11_BUFFER_DESC desc = {}; + desc.ByteWidth = sizeof(CBuff); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + Utils::throwIfFailed(device->CreateBuffer(&desc, NULL, buffer.GetAddressOf())); + } + ID3D11Buffer** get() { + return buffer.GetAddressOf(); + } + void updateData(CBuff& data,ID3D11DeviceContext* ctx) { + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT res = ctx->Map(buffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (SUCCEEDED(res)) { + void* dataPtr = (mappedResource.pData); + memcpy(dataPtr, &data, sizeof(CBuff)); + ctx->Unmap(buffer.Get(), 0); + } else + logD("Could not update constant buffer ", this); + } + }; +} diff --git a/TR5Main/Renderer/Renderer11.cpp b/TR5Main/Renderer/Renderer11.cpp index 3e3b576ab..92c4f6b46 100644 --- a/TR5Main/Renderer/Renderer11.cpp +++ b/TR5Main/Renderer/Renderer11.cpp @@ -64,17 +64,9 @@ namespace T5M::Renderer { DX11_RELEASE(m_psInventory); DX11_RELEASE(m_vsFullScreenQuad); DX11_RELEASE(m_psFullScreenQuad); - DX11_RELEASE(m_cbCameraMatrices); - DX11_RELEASE(m_cbItem); - DX11_RELEASE(m_cbStatic); - DX11_RELEASE(m_cbLights); - DX11_RELEASE(m_cbMisc); - DX11_RELEASE(m_cbHUD); - DX11_RELEASE(m_cbHUDBar); DX11_RELEASE(m_swapChain); DX11_RELEASE(m_context); DX11_RELEASE(m_device); - DX11_RELEASE(m_cbSprite); } void Renderer11::FreeRendererData() { @@ -193,23 +185,6 @@ namespace T5M::Renderer { } - ID3D11Buffer* Renderer11::createConstantBuffer(size_t size) { - ID3D11Buffer* buffer; - - D3D11_BUFFER_DESC desc; - ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC)); - - desc.ByteWidth = size; // Constant buffer must have a size multiple of 16 bytes - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - HRESULT res = m_device->CreateBuffer(&desc, NULL, &buffer); - if (FAILED(res)) - return NULL; - - return buffer; - } void Renderer11::renderToCubemap(const RenderTargetCube& dest,const Vector3& pos,int roomNumer) { for (int i = 0; i < 6; i++) { diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index d13d058a5..faca3223a 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -24,6 +24,7 @@ struct CAMERA_INFO; #include +#include "ConstantBuffer/ConstantBuffer.h" namespace T5M::Renderer { @@ -410,25 +411,25 @@ namespace T5M::Renderer // Constant buffers RenderView gameCamera; - ID3D11Buffer* m_cbCameraMatrices; + ConstantBuffer m_cbCameraMatrices; CItemBuffer m_stItem; - ID3D11Buffer* m_cbItem; + ConstantBuffer m_cbItem; CStaticBuffer m_stStatic; - ID3D11Buffer* m_cbStatic; + ConstantBuffer m_cbStatic; CLightBuffer m_stLights; - ID3D11Buffer* m_cbLights; + ConstantBuffer m_cbLights; CMiscBuffer m_stMisc; - ID3D11Buffer* m_cbMisc; + ConstantBuffer m_cbMisc; CRoomBuffer m_stRoom; - ID3D11Buffer* m_cbRoom; + ConstantBuffer m_cbRoom; CShadowLightBuffer m_stShadowMap; - ID3D11Buffer* m_cbShadowMap; + ConstantBuffer m_cbShadowMap; CHUDBuffer m_stHUD; - ID3D11Buffer* m_cbHUD; + ConstantBuffer m_cbHUD; CHUDBarBuffer m_stHUDBar; - ID3D11Buffer* m_cbHUDBar; + ConstantBuffer m_cbHUDBar; CSpriteBuffer m_stSprite; - ID3D11Buffer* m_cbSprite; + ConstantBuffer m_cbSprite; // Text and sprites SpriteFont* m_gameFont; SpriteBatch* m_spriteBatch; @@ -533,7 +534,6 @@ namespace T5M::Renderer ID3D11GeometryShader* compileGeometryShader(const wchar_t * fileName); ID3D11PixelShader* compilePixelShader(const wchar_t * fileName, const char* function, const char* model, ID3D10Blob** bytecode); ID3D11ComputeShader* compileComputeShader(const wchar_t * fileName); - ID3D11Buffer* createConstantBuffer(size_t size); int getAnimatedTextureInfo(short textureId); void initialiseHairRemaps(); RendererMesh* getRendererMeshFromTrMesh(RendererObject* obj, MESH* meshPtr, short boneIndex, int isJoints, int isHairs); @@ -694,6 +694,11 @@ namespace T5M::Renderer return true; } + template + ConstantBuffer createConstantBuffer() { + return ConstantBuffer(m_device); + } + }; extern Renderer11 g_Renderer; } \ No newline at end of file diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index b8f075fb2..2b5d68b76 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -88,8 +88,8 @@ namespace T5M::Renderer // Set matrices CCameraMatrixBuffer HudCamera; HudCamera.ViewProjection = view * projection; - updateConstantBuffer(m_cbCameraMatrices, HudCamera); - m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); + m_cbCameraMatrices.updateData(HudCamera, m_context); + m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); for (int n = 0; n < moveableObj.ObjectMeshes.size(); n++) { @@ -108,9 +108,9 @@ namespace T5M::Renderer else m_stItem.World = (moveableObj.BindPoseTransforms[n] * world); m_stItem.AmbientLight = Vector4(0.5f, 0.5f, 0.5f, 1.0f); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); - m_context->PSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); for (int m = 0; m < NUM_BUCKETS; m++) { @@ -124,8 +124,8 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); m_stMisc.AlphaTest = (m < 2); - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); } @@ -261,14 +261,14 @@ namespace T5M::Renderer (m_shadowLight->Type == LIGHT_TYPE_POINT ? m_shadowLight->Out : m_shadowLight->Range) * 1.2f); CCameraMatrixBuffer shadowProjection; shadowProjection.ViewProjection = view * projection; - updateConstantBuffer(m_cbCameraMatrices, shadowProjection); - m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); + m_cbCameraMatrices.updateData(shadowProjection, m_context); + m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); m_stShadowMap.LightViewProjection = (view * projection); m_stMisc.AlphaTest = true; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); RendererObject &laraObj = *m_moveableObjects[ID_LARA]; RendererObject &laraSkin = *m_moveableObjects[ID_LARA_SKIN]; @@ -278,9 +278,9 @@ namespace T5M::Renderer m_stItem.Position = Vector4(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; memcpy(m_stItem.BonesMatrices, laraObj.AnimationTransforms.data(), sizeof(Matrix) * 32); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); - m_context->PSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); for (int k = 0; k < laraSkin.ObjectMeshes.size(); k++) { @@ -345,7 +345,7 @@ namespace T5M::Renderer Matrix::Identity, Matrix::Identity, Matrix::Identity, Matrix::Identity}; memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 8); m_stItem.World = Matrix::Identity; - updateConstantBuffer(m_cbItem, m_stItem); + m_cbItem.updateData(m_stItem, m_context); if (m_moveableObjects[ID_LARA_HAIR].has_value()) { @@ -405,12 +405,12 @@ namespace T5M::Renderer m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(2, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = true; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int i = 0; i < 24; i++) { @@ -426,8 +426,8 @@ namespace T5M::Renderer Matrix world = rotation * translation; m_stItem.World = world; - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); RendererMesh *mesh = moveableObj.ObjectMeshes[0]; @@ -518,8 +518,8 @@ namespace T5M::Renderer Matrix::CreatePerspectiveFieldOfView(80.0f * RADIAN, g_Renderer.ScreenWidth / (float)g_Renderer.ScreenHeight, 1.0f, 200000.0f); - updateConstantBuffer(m_cbCameraMatrices, inventoryCam); - m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); + m_cbCameraMatrices.updateData(inventoryCam, m_context); + m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); for (int k = 0; k < NUM_INVENTORY_RINGS; k++) { @@ -612,9 +612,9 @@ namespace T5M::Renderer else m_stItem.World = (moveableObj.BindPoseTransforms[n] * transform); m_stItem.AmbientLight = Vector4(0.5f, 0.5f, 0.5f, 1.0f); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); - m_context->PSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); for (int m = 0; m < NUM_BUCKETS; m++) { @@ -628,8 +628,8 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); m_stMisc.AlphaTest = (m < 2); - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); } @@ -1488,7 +1488,7 @@ namespace T5M::Renderer m_stItem.World = world; m_stItem.Position = Vector4(rat->pos.xPos, rat->pos.yPos, rat->pos.zPos, 1.0f); m_stItem.AmbientLight = m_rooms[rat->roomNumber].AmbientLight; - updateConstantBuffer(m_cbItem, m_stItem); + m_cbItem.updateData(m_stItem, m_context); for (int b = 0; b < 2; b++) { @@ -1546,7 +1546,7 @@ namespace T5M::Renderer m_stItem.World = world; m_stItem.Position = Vector4(bat->pos.xPos, bat->pos.yPos, bat->pos.zPos, 1.0f); m_stItem.AmbientLight = m_rooms[bat->roomNumber].AmbientLight; - updateConstantBuffer(m_cbItem, m_stItem); + m_cbItem.updateData(m_stItem, m_context); m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); m_numDrawCalls++; @@ -1958,13 +1958,12 @@ namespace T5M::Renderer view.fillConstantBuffer(cameraConstantBuffer); cameraConstantBuffer.Frame = GnFrameCounter; cameraConstantBuffer.CameraUnderwater = Rooms[cameraConstantBuffer.RoomNumber].flags & ENV_FLAG_WATER; - updateConstantBuffer(m_cbCameraMatrices, cameraConstantBuffer); - m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); + m_cbCameraMatrices.updateData(cameraConstantBuffer, m_context); + m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); drawHorizonAndSky(depthTarget); drawRooms(false, false, view); drawRooms(false, true, view); drawStatics(false, view); - m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); drawLara(false, false); drawItems(false, false, view); drawItems(false, true, view); @@ -2111,8 +2110,8 @@ namespace T5M::Renderer view.fillConstantBuffer(cameraConstantBuffer); cameraConstantBuffer.Frame = GnFrameCounter; cameraConstantBuffer.CameraUnderwater = Rooms[cameraConstantBuffer.RoomNumber].flags & ENV_FLAG_WATER; - updateConstantBuffer(m_cbCameraMatrices, cameraConstantBuffer); - m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); + m_cbCameraMatrices.updateData(cameraConstantBuffer, m_context); + m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); drawHorizonAndSky(depthTarget); drawRooms(false, false, view); return true; @@ -2151,8 +2150,8 @@ namespace T5M::Renderer m_context->PSSetSamplers(0, 1, &sampler); m_stMisc.AlphaTest = !transparent; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int i = 0; i < view.itemsToDraw.size(); i++) { @@ -2203,19 +2202,19 @@ namespace T5M::Renderer m_stItem.Position = Vector4(item->Item->pos.xPos, item->Item->pos.yPos, item->Item->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; memcpy(m_stItem.BonesMatrices, item->AnimationTransforms, sizeof(Matrix) * 32); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); - m_context->PSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(2, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = !transparent; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int k = 0; k < moveableObj.ObjectMeshes.size(); k++) { @@ -2299,8 +2298,8 @@ namespace T5M::Renderer m_stStatic.World = (Matrix::CreateRotationY(TO_RAD(msh->yRot)) * Matrix::CreateTranslation(msh->x, msh->y, msh->z)); m_stStatic.Color = Vector4(((msh->shade >> 10) & 0xFF) / 255.0f, ((msh->shade >> 5) & 0xFF) / 255.0f, ((msh->shade >> 0) & 0xFF) / 255.0f, 1.0f); - updateConstantBuffer(m_cbStatic, m_stStatic); - m_context->VSSetConstantBuffers(1, 1, &m_cbStatic); + m_cbStatic.updateData(m_stStatic, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); for (int j = firstBucket; j < lastBucket; j++) { @@ -2352,6 +2351,7 @@ namespace T5M::Renderer // Set shadow map data if (m_shadowLight != NULL) { + memcpy(&m_stShadowMap.Light, m_shadowLight, sizeof(ShaderLight)); m_stShadowMap.CastShadows = true; //m_stShadowMap.ViewProjectionInverse = ViewProjection.Invert(); @@ -2360,10 +2360,9 @@ namespace T5M::Renderer { m_stShadowMap.CastShadows = false; } - - updateConstantBuffer(m_cbShadowMap, m_stShadowMap); - m_context->VSSetConstantBuffers(4, 1, &m_cbShadowMap); - m_context->PSSetConstantBuffers(4, 1, &m_cbShadowMap); + m_cbShadowMap.updateData(m_stShadowMap, m_context); + m_context->VSSetConstantBuffers(4, 1, m_cbShadowMap.get()); + m_context->PSSetConstantBuffers(4, 1, m_cbShadowMap.get()); if (animated) m_primitiveBatch->Begin(); @@ -2375,18 +2374,18 @@ namespace T5M::Renderer m_stLights.NumLights = view.lightsToDraw.size(); for (int j = 0; j < view.lightsToDraw.size(); j++) memcpy(&m_stLights.Lights[j], view.lightsToDraw[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(1, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(1, 1, m_cbLights.get()); m_stMisc.Caustics = (room->Room->flags & ENV_FLAG_WATER); m_stMisc.AlphaTest = !transparent; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_stRoom.AmbientColor = room->AmbientLight; m_stRoom.water = (room->Room->flags & ENV_FLAG_WATER) != 0 ? 1 : 0; - updateConstantBuffer(m_cbRoom, m_stRoom); - m_context->VSSetConstantBuffers(5, 1, &m_cbRoom); - m_context->PSSetConstantBuffers(5, 1, &m_cbRoom); + m_cbRoom.updateData(m_stRoom, m_context); + m_context->VSSetConstantBuffers(5, 1, m_cbRoom.get()); + m_context->PSSetConstantBuffers(5, 1, m_cbRoom.get()); for (int j = firstBucket; j < lastBucket; j++) { RendererBucket *bucket; @@ -2517,8 +2516,8 @@ namespace T5M::Renderer m_context->PSSetShader(m_psSky, NULL, 0); m_stMisc.AlphaTest = true; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->PSSetShaderResources(0, 1, m_skyTexture.ShaderResourceView.GetAddressOf()); sampler = m_states->AnisotropicClamp(); @@ -2534,9 +2533,9 @@ namespace T5M::Renderer m_stStatic.World = (rotation * translation); m_stStatic.Color = color; - updateConstantBuffer(m_cbStatic, m_stStatic); - m_context->VSSetConstantBuffers(1, 1, &m_cbStatic); - m_context->PSSetConstantBuffers(1, 1, &m_cbStatic); + m_cbStatic.updateData(m_stStatic, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbStatic.get()); m_primitiveBatch->Begin(); m_primitiveBatch->DrawQuad(vertices[0], vertices[1], vertices[2], vertices[3]); @@ -2561,13 +2560,13 @@ namespace T5M::Renderer m_stStatic.World = Matrix::CreateTranslation(Camera.pos.x, Camera.pos.y, Camera.pos.z); m_stStatic.Position = Vector4::Zero; m_stStatic.Color = Vector4::One; - updateConstantBuffer(m_cbStatic, m_stStatic); - m_context->VSSetConstantBuffers(1, 1, &m_cbStatic); - m_context->PSSetConstantBuffers(1, 1, &m_cbStatic); + m_cbStatic.updateData(m_stStatic, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbStatic.get()); m_stMisc.AlphaTest = true; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int k = 0; k < moveableObj.ObjectMeshes.size(); k++) { diff --git a/TR5Main/Renderer/Renderer11Draw2D.cpp b/TR5Main/Renderer/Renderer11Draw2D.cpp index 3cabe68bf..05f7637cf 100644 --- a/TR5Main/Renderer/Renderer11Draw2D.cpp +++ b/TR5Main/Renderer/Renderer11Draw2D.cpp @@ -84,7 +84,7 @@ namespace T5M::Renderer { m_context->IASetVertexBuffers(0, 1, bar->vertexBufferBorder.Buffer.GetAddressOf(), &strides, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetIndexBuffer(bar->indexBufferBorder.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); - m_context->VSSetConstantBuffers(0, 1, &m_cbHUD); + m_context->VSSetConstantBuffers(0, 1, m_cbHUD.get()); m_context->VSSetShader(m_vsHUD, NULL, 0); m_context->PSSetShaderResources(0, 1, m_HUDBarBorderTexture.ShaderResourceView.GetAddressOf()); ID3D11SamplerState* sampler = m_states->LinearClamp(); @@ -102,9 +102,9 @@ namespace T5M::Renderer { m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetIndexBuffer(bar->indexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); m_stHUDBar.Percent = percent; - updateConstantBuffer(m_cbHUDBar, m_stHUDBar); - m_context->VSSetConstantBuffers(0, 1, &m_cbHUD); - m_context->PSSetConstantBuffers(0, 1, &m_cbHUDBar); + m_cbHUDBar.updateData(m_stHUDBar, m_context); + m_context->VSSetConstantBuffers(0, 1, m_cbHUD.get()); + m_context->PSSetConstantBuffers(0, 1, m_cbHUDBar.get()); m_context->VSSetShader(m_vsHUD, NULL, 0); m_context->PSSetShader(m_psHUDBarColor, NULL, 0); m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); diff --git a/TR5Main/Renderer/Renderer11DrawEffect.cpp b/TR5Main/Renderer/Renderer11DrawEffect.cpp index 8f52626d4..33b96ab2d 100644 --- a/TR5Main/Renderer/Renderer11DrawEffect.cpp +++ b/TR5Main/Renderer/Renderer11DrawEffect.cpp @@ -501,12 +501,12 @@ namespace T5M::Renderer { m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(2, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = true; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); short length = 0; short zOffset = 0; @@ -556,8 +556,8 @@ namespace T5M::Renderer { world = rotation2 * world; m_stItem.World = world; - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->DrawIndexed(flashBucket->Indices.size(), flashBucket->StartIndex, 0); m_numDrawCalls++; @@ -569,8 +569,8 @@ namespace T5M::Renderer { world = rotation2 * world; m_stItem.World = world; - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->DrawIndexed(flashBucket->Indices.size(), flashBucket->StartIndex, 0); m_numDrawCalls++; @@ -608,12 +608,12 @@ namespace T5M::Renderer { m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(2, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = true; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthRead(), 0); @@ -644,8 +644,8 @@ namespace T5M::Renderer { world = rotationZ * world; m_stItem.World = world; - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->DrawIndexed(flashBucket->Indices.size(), flashBucket->StartIndex, 0); m_numDrawCalls++; @@ -744,8 +744,8 @@ namespace T5M::Renderer { m_context->PSSetShader(m_psSprites, NULL, 0); m_stMisc.AlphaTest = true; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); m_context->IASetInputLayout(m_inputLayout); @@ -792,8 +792,8 @@ namespace T5M::Renderer { m_stSprite.billboardMatrix = billboardMatrix; m_stSprite.color = spr->color; m_stSprite.isBillboard = true; - updateConstantBuffer(m_cbSprite, m_stSprite); - m_context->VSSetConstantBuffers(4, 1, &m_cbSprite); + m_cbSprite.updateData(m_stSprite, m_context); + m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_context->Draw(4, 0); } else if (spr->Type == RENDERER_SPRITE_TYPE::SPRITE_TYPE_BILLBOARD_CUSTOM) { Matrix rotation = Matrix::CreateRotationZ(spr->Rotation); @@ -808,8 +808,8 @@ namespace T5M::Renderer { m_stSprite.billboardMatrix = billboardMatrix; m_stSprite.color = spr->color; m_stSprite.isBillboard = true; - updateConstantBuffer(m_cbSprite, m_stSprite); - m_context->VSSetConstantBuffers(4, 1, &m_cbSprite); + m_cbSprite.updateData(m_stSprite, m_context); + m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_context->Draw(4, 0); } else if (spr->Type == RENDERER_SPRITE_TYPE::SPRITE_TYPE_BILLBOARD_LOOKAT) { Matrix translation = Matrix::CreateTranslation(spr->pos); @@ -819,8 +819,8 @@ namespace T5M::Renderer { m_stSprite.billboardMatrix = billboardMatrix; m_stSprite.color = spr->color; m_stSprite.isBillboard = true; - updateConstantBuffer(m_cbSprite, m_stSprite); - m_context->VSSetConstantBuffers(4, 1, &m_cbSprite); + m_cbSprite.updateData(m_stSprite, m_context); + m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_context->Draw(4, 0); }else if (spr->Type == RENDERER_SPRITE_TYPE::SPRITE_TYPE_3D) { m_primitiveBatch->Begin(); @@ -862,8 +862,8 @@ namespace T5M::Renderer { v3.Color = spr->color; m_stSprite.color = spr->color; m_stSprite.isBillboard = false; - updateConstantBuffer(m_cbSprite, m_stSprite); - m_context->VSSetConstantBuffers(4, 1, &m_cbSprite); + m_cbSprite.updateData(m_stSprite, m_context); + m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_primitiveBatch->DrawQuad(v0, v1, v2, v3); m_primitiveBatch->End(); } @@ -893,18 +893,18 @@ namespace T5M::Renderer { m_stItem.AmbientLight = room.AmbientLight; Matrix matrices[1] = { Matrix::Identity }; memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix)); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_stLights.NumLights = effect->Lights.size(); for (int j = 0; j < effect->Lights.size(); j++) memcpy(&m_stLights.Lights[j], effect->Lights[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(2, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = !transparent; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); RendererMesh* mesh = effect->Mesh; @@ -967,18 +967,18 @@ namespace T5M::Renderer { m_stItem.Position = Vector4(item->Item->pos.xPos, item->Item->pos.yPos, item->Item->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; //Vector4::One * 0.1f; // room->AmbientLight; memcpy(m_stItem.BonesMatrices, item->AnimationTransforms, sizeof(Matrix) * 32); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(2, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = false; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_primitiveBatch->Begin(); @@ -1114,16 +1114,16 @@ namespace T5M::Renderer { m_stCameraMatrices.View = View.Transpose(); m_stCameraMatrices.Projection = Projection.Transpose(); updateConstantBuffer(m_cbCameraMatrices, &m_stCameraMatrices, sizeof(CCameraMatrixBuffer)); - m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); + m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices); m_stMisc.AlphaTest = !transparent; updateConstantBuffer(m_cbMisc, &m_stMisc, sizeof(CMiscBuffer)); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc); m_stStatic.World = Matrix::Identity; m_stStatic.Color = Vector4::One; updateConstantBuffer(m_cbStatic, &m_stStatic, sizeof(CStaticBuffer)); - m_context->VSSetConstantBuffers(1, 1, &m_cbStatic); + m_context->VSSetConstantBuffers(1, 1, m_cbStatic); // Draw vertices m_primitiveBatch->Draw(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST, vertices.data(), vertices.size()); @@ -1150,14 +1150,14 @@ namespace T5M::Renderer { //m_stCameraMatrices.View = View.Transpose(); //m_stCameraMatrices.Projection = Projection.Transpose(); //updateConstantBuffer(m_cbCameraMatrices, &m_stCameraMatrices, sizeof(CCameraMatrixBuffer)); - //m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); + //m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices); m_stMisc.AlphaTest = !transparent; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_stStatic.World = world; m_stStatic.Color = Vector4::One; - updateConstantBuffer(m_cbStatic, m_stStatic); - m_context->VSSetConstantBuffers(1, 1, &m_cbStatic); + m_cbStatic.updateData(m_stStatic, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); RendererVertex vtx0 = deb->mesh.vertices[0]; RendererVertex vtx1 = deb->mesh.vertices[1]; RendererVertex vtx2 = deb->mesh.vertices[2]; diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 085e1510f..0bec2e574 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -181,20 +181,20 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h return false; // Initialise constant buffers - m_cbCameraMatrices = createConstantBuffer(sizeof(CCameraMatrixBuffer)); - m_cbItem = createConstantBuffer(sizeof(CItemBuffer)); - m_cbStatic = createConstantBuffer(sizeof(CStaticBuffer)); - m_cbLights = createConstantBuffer(sizeof(CLightBuffer)); - m_cbMisc = createConstantBuffer(sizeof(CMiscBuffer)); - m_cbShadowMap = createConstantBuffer(sizeof(CShadowLightBuffer)); - m_cbRoom = createConstantBuffer(sizeof(CRoomBuffer)); + m_cbCameraMatrices = createConstantBuffer(); + m_cbItem = createConstantBuffer(); + m_cbStatic = createConstantBuffer(); + m_cbLights = createConstantBuffer(); + m_cbMisc = createConstantBuffer(); + m_cbShadowMap = createConstantBuffer(); + m_cbRoom = createConstantBuffer(); //Prepare HUD Constant buffer - m_cbHUDBar = createConstantBuffer(sizeof(CHUDBarBuffer)); - m_cbHUD = createConstantBuffer(sizeof(CHUDBuffer)); - m_cbSprite = createConstantBuffer(sizeof(CSpriteBuffer)); + m_cbHUDBar = createConstantBuffer(); + m_cbHUD = createConstantBuffer(); + m_cbSprite = createConstantBuffer(); m_stHUD.View = Matrix::CreateLookAt(Vector3::Zero, Vector3(0, 0, 1), Vector3(0, -1, 0)); m_stHUD.Projection =Matrix::CreateOrthographicOffCenter(0, REFERENCE_RES_WIDTH, 0, REFERENCE_RES_HEIGHT, 0, 1.0f); - updateConstantBuffer(m_cbHUD, m_stHUD); + m_cbHUD.updateData(m_stHUD, m_context); m_currentCausticsFrame = 0; m_firstWeather = true; @@ -417,6 +417,7 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, bool Renderer11::Create() { + D3D_FEATURE_LEVEL levels[1] = { D3D_FEATURE_LEVEL_10_0 }; D3D_FEATURE_LEVEL featureLevel; HRESULT res; diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 3f355cc7d..5c1e5dffd 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -178,8 +178,8 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap) m_context->PSSetSamplers(0, 1, &sampler); m_stMisc.AlphaTest = !transparent; - updateConstantBuffer(m_cbMisc, m_stMisc); - m_context->PSSetConstantBuffers(3, 1, &m_cbMisc); + m_cbMisc.updateData(m_stMisc, m_context); + m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); RendererObject &laraObj = *m_moveableObjects[ID_LARA]; RendererObject &laraSkin = *m_moveableObjects[ID_LARA_SKIN]; @@ -189,17 +189,17 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap) m_stItem.Position = Vector4(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; memcpy(m_stItem.BonesMatrices, laraObj.AnimationTransforms.data(), sizeof(Matrix) * 32); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); - m_context->PSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); if (!shadowMap) { m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - updateConstantBuffer(m_cbLights, m_stLights); - m_context->PSSetConstantBuffers(2, 1, &m_cbLights); + m_cbLights.updateData(m_stLights, m_context); + m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); } for (int k = 0; k < laraSkin.ObjectMeshes.size(); k++) @@ -257,9 +257,9 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap) matrices[i + 1] = world; } memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 7); - updateConstantBuffer(m_cbItem, m_stItem); - m_context->VSSetConstantBuffers(1, 1, &m_cbItem); - m_context->PSSetConstantBuffers(1, 1, &m_cbItem); + m_cbItem.updateData(m_stItem,m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); for (int k = 0; k < hairsObj.ObjectMeshes.size(); k++) { diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 5a6689fa0..7ddaa80ef 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -148,6 +148,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index d7d6ae475..432f6927f 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -849,6 +849,9 @@ File di intestazione + + File di intestazione + From 26c0cc0cfffc29a38bbf2fccf0d7e5e869ca8368 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Sat, 25 Jul 2020 21:03:02 +0200 Subject: [PATCH 02/22] Refactored Shadow Mapping with Comparision State --- TR5Main/Renderer/RenderEnums.h | 1 - TR5Main/Renderer/Renderer11.h | 6 ++- TR5Main/Renderer/Renderer11Draw.cpp | 57 ++++++++++++-------- TR5Main/Renderer/Renderer11Init.cpp | 81 ++++------------------------- TR5Main/Shaders/DX11_Rooms.fx | 35 ++++++------- 5 files changed, 66 insertions(+), 114 deletions(-) diff --git a/TR5Main/Renderer/RenderEnums.h b/TR5Main/Renderer/RenderEnums.h index ed107c324..b3c549acf 100644 --- a/TR5Main/Renderer/RenderEnums.h +++ b/TR5Main/Renderer/RenderEnums.h @@ -93,7 +93,6 @@ typedef enum RENDERER_FADE_STATUS constexpr auto TEXTURE_HEIGHT = 256; constexpr auto TEXTURE_WIDTH = 256; constexpr auto TEXTURE_PAGE = (TEXTURE_HEIGHT * TEXTURE_WIDTH); -#define SHADOW_MAP_SIZE 1024 #define TEXTURE_ATLAS_SIZE 4096 #define TEXTURE_PAGE_SIZE 262144 #define NUM_TEXTURE_PAGES_PER_ROW 16 diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index faca3223a..d1199ea3d 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -28,6 +28,7 @@ struct CAMERA_INFO; namespace T5M::Renderer { + constexpr size_t SHADOW_MAP_SIZE = 512; using TexturePair = std::tuple; #define MESH_BITS(x) (1 << x) #define DX11_RELEASE(x) if (x != NULL) x->Release() @@ -404,6 +405,9 @@ namespace T5M::Renderer ID3D11PixelShader* m_psHUDTexture; ID3D11PixelShader* m_psHUDBarColor; + + ID3D11SamplerState* m_shadowSampler; + ID3D11ShaderResourceView* m_shadowMapRV; ID3D11Texture2D* m_shadowMapTexture; ID3D11DepthStencilView* m_shadowMapDSV; @@ -566,7 +570,7 @@ namespace T5M::Renderer bool drawScaledSpikes(RendererItem* item, bool transparent, bool animated); bool drawStatics(bool transparent, RenderView& view); bool drawWaterfalls(); - bool drawShadowMap(); + bool drawShadowMap(RenderView& view); bool drawObjectOn2DPosition(short x, short y, short objectNum, short rotX, short rotY, short rotZ); bool drawLara(bool transparent, bool shadowMap); void printDebugMessage(LPCSTR message, ...); diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index 2b5d68b76..bc17898fe 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -20,6 +20,7 @@ #include "tr5_spider_emitter.h" #include "ConstantBuffers/CameraMatrixBuffer.h" #include "RenderView/RenderView.h" +#include "hair.h" extern T5M::Renderer::RendererHUDBar *g_DashBar; extern T5M::Renderer::RendererHUDBar *g_SFXVolumeBar; extern T5M::Renderer::RendererHUDBar *g_MusicVolumeBar; @@ -134,16 +135,16 @@ namespace T5M::Renderer return true; } - bool Renderer11::drawShadowMap() + bool Renderer11::drawShadowMap(RenderView& renderView) { m_shadowLight = NULL; RendererLight *brightestLight = NULL; float brightest = 0.0f; Vector3 itemPosition = Vector3(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos); - for (int k = 0; k < m_roomsToDraw.size(); k++) + for (int k = 0; k < renderView.roomsToDraw.size(); k++) { - RendererRoom *room = m_roomsToDraw[k]; + RendererRoom *room = renderView.roomsToDraw[k]; int numLights = room->Lights.size(); for (int j = 0; j < numLights; j++) @@ -340,21 +341,36 @@ namespace T5M::Renderer // Draw items - // Hairs are pre-transformed - Matrix matrices[8] = {Matrix::Identity, Matrix::Identity, Matrix::Identity, Matrix::Identity, - Matrix::Identity, Matrix::Identity, Matrix::Identity, Matrix::Identity}; - memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 8); - m_stItem.World = Matrix::Identity; - m_cbItem.updateData(m_stItem, m_context); + RendererObject& hairsObj = *m_moveableObjects[ID_LARA_HAIR]; - if (m_moveableObjects[ID_LARA_HAIR].has_value()) - { - m_primitiveBatch->Begin(); - m_primitiveBatch->DrawIndexed(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, - (const unsigned short *)m_hairIndices.data(), m_numHairIndices, - m_hairVertices.data(), m_numHairVertices); - m_primitiveBatch->End(); - } + // First matrix is Lara's head matrix, then all 6 hairs matrices. Bones are adjusted at load time for accounting this. + m_stItem.World = Matrix::Identity; + Matrix matrices[7]; + matrices[0] = laraObj.AnimationTransforms[LM_HEAD] * m_LaraWorldMatrix; + for (int i = 0; i < hairsObj.BindPoseTransforms.size(); i++) { + HAIR_STRUCT* hairs = &Hairs[0][i]; + Matrix world = Matrix::CreateFromYawPitchRoll(TO_RAD(hairs->pos.yRot), TO_RAD(hairs->pos.xRot), 0) * Matrix::CreateTranslation(hairs->pos.xPos, hairs->pos.yPos, hairs->pos.zPos); + matrices[i + 1] = world; + } + memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 7); + m_cbItem.updateData(m_stItem, m_context); + m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); + m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); + + for (int k = 0; k < hairsObj.ObjectMeshes.size(); k++) { + RendererMesh* mesh = hairsObj.ObjectMeshes[k]; + + for (int j = 0; j < 4; j++) { + RendererBucket* bucket = &mesh->Buckets[j]; + + if (bucket->Vertices.size() == 0) + continue; + + // Draw vertices + m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); + m_numDrawCalls++; + } + } return true; } @@ -1894,7 +1910,7 @@ namespace T5M::Renderer return 0; } - bool Renderer11::drawScene(ID3D11RenderTargetView *target, ID3D11DepthStencilView *depthTarget, RenderView &view) + bool Renderer11::drawScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view) { using ns = std::chrono::nanoseconds; using get_time = std::chrono::steady_clock; @@ -1925,7 +1941,7 @@ namespace T5M::Renderer updateItemsAnimations(); updateEffects(); if (g_Configuration.EnableShadows) - drawShadowMap(); + drawShadowMap(view); m_items[Lara.itemNumber].Item = LaraItem; collectLightsForItem(LaraItem->roomNumber, &m_items[Lara.itemNumber], view); @@ -2342,10 +2358,9 @@ namespace T5M::Renderer m_context->PSSetShaderResources(0, 1, (std::get<0>(m_roomTextures[0])).ShaderResourceView.GetAddressOf()); m_context->PSSetShaderResources(3, 1, (std::get<1>(m_roomTextures[0])).ShaderResourceView.GetAddressOf()); ID3D11SamplerState *sampler = m_states->AnisotropicWrap(); - ID3D11SamplerState *shadowSampler = m_states->PointClamp(); m_context->PSSetSamplers(0, 1, &sampler); m_context->PSSetShaderResources(1, 1, m_caustics[m_currentCausticsFrame / 2].ShaderResourceView.GetAddressOf()); - m_context->PSSetSamplers(1, 1, &shadowSampler); + m_context->PSSetSamplers(1, 1, &m_shadowSampler); m_context->PSSetShaderResources(2, 1, m_shadowMap.ShaderResourceView.GetAddressOf()); // Set shadow map data diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 0bec2e574..b8430ba88 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -71,8 +71,6 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h ID3D10Blob * blob; m_vsRooms = compileVertexShader(L"Shaders\\DX11_Rooms.fx", "VS", "vs_4_0", &blob); - if (m_vsRooms == NULL) - return false; // Initialise input layout using the first vertex shader D3D11_INPUT_ELEMENT_DESC inputLayout[] = @@ -87,98 +85,30 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h }; m_inputLayout = NULL; - res = m_device->CreateInputLayout(inputLayout, 7, blob->GetBufferPointer(), blob->GetBufferSize(), &m_inputLayout); - if (FAILED(res)) - return false; - + Utils::throwIfFailed(m_device->CreateInputLayout(inputLayout, 7, blob->GetBufferPointer(), blob->GetBufferSize(), &m_inputLayout)); m_psRooms = compilePixelShader(L"Shaders\\DX11_Rooms.fx", "PS", "ps_4_0", &blob); - if (m_psRooms == NULL) - return false; - m_vsItems = compileVertexShader(L"Shaders\\DX11_Items.fx", "VS", "vs_4_0", &blob); - if (m_vsItems == NULL) - return false; - m_psItems = compilePixelShader(L"Shaders\\DX11_Items.fx", "PS", "ps_4_0", &blob); - if (m_psItems == NULL) - return false; - m_vsStatics = compileVertexShader(L"Shaders\\DX11_Statics.fx", "VS", "vs_4_0", &blob); - if (m_vsStatics == NULL) - return false; - m_psStatics = compilePixelShader(L"Shaders\\DX11_Statics.fx", "PS", "ps_4_0", &blob); - if (m_psStatics == NULL) - return false; - m_vsHairs = compileVertexShader(L"Shaders\\DX11_Hairs.fx", "VS", "vs_4_0", &blob); - if (m_vsHairs == NULL) - return false; - m_psHairs = compilePixelShader(L"Shaders\\DX11_Hairs.fx", "PS", "ps_4_0", &blob); - if (m_psHairs == NULL) - return false; - m_vsSky = compileVertexShader(L"Shaders\\DX11_Sky.fx", "VS", "vs_4_0", &blob); - if (m_vsSky == NULL) - return false; - m_psSky = compilePixelShader(L"Shaders\\DX11_Sky.fx", "PS", "ps_4_0", &blob); - if (m_psSky == NULL) - return false; - m_vsSprites = compileVertexShader(L"Shaders\\DX11_Sprites.fx", "VS", "vs_4_0", &blob); - if (m_vsSprites == NULL) - return false; - m_psSprites = compilePixelShader(L"Shaders\\DX11_Sprites.fx", "PS", "ps_4_0", &blob); - if (m_psSprites == NULL) - return false; - m_vsSolid = compileVertexShader(L"Shaders\\DX11_Solid.fx", "VS", "vs_4_0", &blob); - if (m_vsSolid == NULL) - return false; - m_psSolid = compilePixelShader(L"Shaders\\DX11_Solid.fx", "PS", "ps_4_0", &blob); - if (m_psSolid == NULL) - return false; - m_vsInventory = compileVertexShader(L"Shaders\\DX11_Inventory.fx", "VS", "vs_4_0", &blob); - if (m_vsInventory == NULL) - return false; - m_psInventory = compilePixelShader(L"Shaders\\DX11_Inventory.fx", "PS", "ps_4_0", &blob); - if (m_psInventory == NULL) - return false; - m_vsFullScreenQuad = compileVertexShader(L"Shaders\\DX11_FullScreenQuad.fx", "VS", "vs_4_0", &blob); - if (m_vsFullScreenQuad == NULL) - return false; - m_psFullScreenQuad = compilePixelShader(L"Shaders\\DX11_FullScreenQuad.fx", "PS", "ps_4_0", &blob); - if (m_psFullScreenQuad == NULL) - return false; - m_vsShadowMap = compileVertexShader(L"Shaders\\DX11_ShadowMap.fx", "VS", "vs_4_0", &blob); - if (m_vsShadowMap == NULL) - return false; - m_psShadowMap = compilePixelShader(L"Shaders\\DX11_ShadowMap.fx", "PS", "ps_4_0", &blob); - if (m_psShadowMap == NULL) - return false; - m_vsHUD = compileVertexShader(L"Shaders\\HUD\\DX11_VS_HUD.hlsl", "VS", "vs_4_0", &blob); - if (m_vsHUD == NULL) - return false; m_psHUDColor = compilePixelShader(L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSColored", "ps_4_0", &blob); - if (m_psHUDColor == NULL) - return false; m_psHUDTexture = compilePixelShader(L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSTextured", "ps_4_0", &blob); - if (m_psHUDTexture == NULL) - return false; m_psHUDBarColor = compilePixelShader(L"Shaders\\HUD\\DX11_PS_HUDBar.hlsl", "PSColored", "ps_4_0", &blob); - if (m_psHUDBarColor == NULL) - return false; // Initialise constant buffers m_cbCameraMatrices = createConstantBuffer(); @@ -231,7 +161,14 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h blendStateDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA; blendStateDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; blendStateDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - m_device->CreateBlendState(&blendStateDesc, &m_subtractiveBlendState); + Utils::throwIfFailed(m_device->CreateBlendState(&blendStateDesc, &m_subtractiveBlendState)); + D3D11_SAMPLER_DESC shadowSamplerDesc = {}; + shadowSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + shadowSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + shadowSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + shadowSamplerDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL; + shadowSamplerDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT; + Utils::throwIfFailed(m_device->CreateSamplerState(&shadowSamplerDesc,&m_shadowSampler)); initialiseBars(); initQuad(m_device); return true; diff --git a/TR5Main/Shaders/DX11_Rooms.fx b/TR5Main/Shaders/DX11_Rooms.fx index 5900bed86..a1140dd49 100644 --- a/TR5Main/Shaders/DX11_Rooms.fx +++ b/TR5Main/Shaders/DX11_Rooms.fx @@ -54,7 +54,7 @@ SamplerState Sampler : register(s0); Texture2D CausticsTexture : register(t1); Texture2D ShadowMap : register(t2); -SamplerState ShadowMapSampler : register(s1); +SamplerComparisonState ShadowMapSampler : register(s1); PixelShaderInput VS(VertexShaderInput input) { PixelShaderInput output; @@ -79,17 +79,8 @@ PixelShaderInput VS(VertexShaderInput input) return output; } -float getShadowFactor(Texture2D shadowMap, SamplerState shadowMapSampler, float2 coords, float realDepth) { - const float texelSize = 1.0f / 1024; - float shadowFactor = 0.0f; - //doing 9 samples - for (float x = -1; x <= 1.0f; x++) { - for (float y = -1; y <= 1.0f; y++) { - float shadowMapDepth = ShadowMap.SampleLevel(ShadowMapSampler, coords + (float2(x, y)*texelSize),0).r; - shadowFactor += shadowMapDepth < realDepth ? 1.0f : 0.0f; - } - } - return shadowFactor / 9.0f; +float2 texOffset(int u, int v) { + return float2(u * 1.0f / 512, v * 1.0f / 512); } float4 PS(PixelShaderInput input) : SV_TARGET @@ -117,16 +108,22 @@ float4 PS(PixelShaderInput input) : SV_TARGET input.LightPosition.y >= -1.0f && input.LightPosition.y <= 1.0f && input.LightPosition.z >= 0.0f && input.LightPosition.z <= 1.0f) { - float2 coords = float2(input.LightPosition.x / 2.0f + 0.5f, -input.LightPosition.y / 2.0f + 0.5f); + input.LightPosition.x = input.LightPosition.x / 2 + 0.5; + input.LightPosition.y = input.LightPosition.y / -2 + 0.5; - // Sample shadow map - point sampler - float shadowMapDepth = ShadowMap.Sample(ShadowMapSampler, coords).r; + //PCF sampling for shadow map + float sum = 0; + float x, y; - float realDepth = input.LightPosition.z; + //perform PCF filtering on a 4 x 4 texel neighborhood + for (y = -1.5; y <= 1.5; y += 1.0) { + for (x = -1.5; x <= 1.5; x += 1.0) { + sum += ShadowMap.SampleCmpLevelZero(ShadowMapSampler, input.LightPosition.xy + texOffset(x, y), input.LightPosition.z); + } + } - // If clip space z value greater than shadow map value then pixel is in shadow - float shadow = getShadowFactor(ShadowMap, ShadowMapSampler, coords, realDepth); - lighting = lerp(lighting, min(AmbientColor*2,lighting), saturate(shadow)); + float shadowFactor = sum / 16.0; + lighting = lerp(lighting, min(AmbientColor*2,lighting), 1-saturate(shadowFactor)); } } From ccf072833bdc5db050bfab8189d63246c47fe97f Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Sun, 26 Jul 2020 16:15:35 +0200 Subject: [PATCH 03/22] RenderTargetCubeArray for Shadow Maps --- .../RenderTarget2D/RenderTarget2D.cpp | 6 +- .../Renderer/RenderTarget2D/RenderTarget2D.h | 2 +- .../RenderTargetCube/RenderTargetCube.cpp | 8 +- .../RenderTargetCube/RenderTargetCube.h | 2 +- .../RenderTargetCubeArray.cpp | 76 +++++++++++++++++++ .../RenderTargetCubeArray.h | 35 +++++++++ TR5Main/Renderer/Renderer11.h | 5 +- TR5Main/Renderer/Renderer11Init.cpp | 8 +- TR5Main/Shaders/DX11_Rooms.fx | 2 +- TR5Main/TR5Main.vcxproj | 2 + TR5Main/TR5Main.vcxproj.filters | 6 ++ 11 files changed, 136 insertions(+), 16 deletions(-) create mode 100644 TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.cpp create mode 100644 TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h diff --git a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp index 0a5cf351d..dde635d20 100644 --- a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp +++ b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp @@ -3,14 +3,14 @@ #include "Utils.h" namespace T5M::Renderer { using T5M::Renderer::Utils::throwIfFailed; - RenderTarget2D::RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT format) { + RenderTarget2D::RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT colorFormat, DXGI_FORMAT depthFormat) { D3D11_TEXTURE2D_DESC desc = {}; desc.Width = w; desc.Height = h; desc.MipLevels = 1; desc.ArraySize = 1; - desc.Format = format; + desc.Format = colorFormat; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_DEFAULT; @@ -46,7 +46,7 @@ namespace T5M::Renderer { depthTexDesc.ArraySize = 1; depthTexDesc.SampleDesc.Count = 1; depthTexDesc.SampleDesc.Quality = 0; - depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + depthTexDesc.Format = depthFormat; depthTexDesc.Usage = D3D11_USAGE_DEFAULT; depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthTexDesc.CPUAccessFlags = 0; diff --git a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h index a540621eb..109285661 100644 --- a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h +++ b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h @@ -11,7 +11,7 @@ namespace T5M::Renderer { ComPtr DepthStencilTexture; ComPtr DepthShaderResourceView; RenderTarget2D() {}; - RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT format); + RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT colorFormat, DXGI_FORMAT depthFormat = DXGI_FORMAT_D32_FLOAT); }; } diff --git a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp index 528514ad6..0ba6c0f7c 100644 --- a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp +++ b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp @@ -2,14 +2,14 @@ #include "RenderTargetCube.h" #include "Utils.h" using T5M::Renderer::Utils::throwIfFailed; -T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT format) : resolution(resolution) { +T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT colorFormat, DXGI_FORMAT depthFormat) : resolution(resolution) { D3D11_TEXTURE2D_DESC desc = {}; desc.Width = resolution; desc.Height = resolution; desc.MipLevels = 1; desc.ArraySize = 6; - desc.Format = format; + desc.Format = colorFormat; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_DEFAULT; @@ -17,7 +17,7 @@ T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int reso desc.CPUAccessFlags = 0; desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; - HRESULT res = device->CreateTexture2D(&desc, NULL, &Texture); + HRESULT res = device->CreateTexture2D(&desc, NULL, Texture.GetAddressOf()); throwIfFailed(res); D3D11_RENDER_TARGET_VIEW_DESC viewDesc = {}; @@ -49,7 +49,7 @@ T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int reso depthTexDesc.ArraySize = 6; depthTexDesc.SampleDesc.Count = 1; depthTexDesc.SampleDesc.Quality = 0; - depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + depthTexDesc.Format = depthFormat; depthTexDesc.Usage = D3D11_USAGE_DEFAULT; depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthTexDesc.CPUAccessFlags = 0; diff --git a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h index dd0007a8a..e8fd7f3a1 100644 --- a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h +++ b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h @@ -36,6 +36,6 @@ namespace T5M::Renderer { int resolution; D3D11_VIEWPORT viewport; RenderTargetCube() : resolution(0), viewport({}) {}; - RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT format); + RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT format, DXGI_FORMAT depthFormat = DXGI_FORMAT_D32_FLOAT); }; } \ No newline at end of file diff --git a/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.cpp b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.cpp new file mode 100644 index 000000000..34efd5bc6 --- /dev/null +++ b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.cpp @@ -0,0 +1,76 @@ +#include "framework.h" +#include "RenderTargetCubeArray.h" +#include "Utils.h" +namespace T5M::Renderer { + RenderTargetCubeArray::RenderTargetCubeArray(ID3D11Device* device, size_t resolution, size_t numCubes, DXGI_FORMAT colorFormat,DXGI_FORMAT depthFormat) : numCubes(numCubes), resolution(resolution), viewport(CreateViewport(resolution)) { + D3D11_TEXTURE2D_DESC desc = {}; + desc.ArraySize = numCubes*6; + desc.Height = resolution; + desc.Width = resolution; + desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.CPUAccessFlags = 0x0; + desc.SampleDesc.Count = 1; + desc.MipLevels = 1; + desc.Format = colorFormat; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; + desc.SampleDesc.Quality = 0; + HRESULT res = device->CreateTexture2D(&desc, nullptr, Texture.GetAddressOf()); + Utils::throwIfFailed(res); + + D3D11_RENDER_TARGET_VIEW_DESC viewDesc = {}; + viewDesc.Format = desc.Format; + viewDesc.Texture2DArray.ArraySize = 1; + viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; + RenderTargetView.resize(numCubes); + for(int i = 0; i < numCubes - 1; i++) + for(int j = 0; j < 6; j++){ + viewDesc.Texture2DArray.FirstArraySlice = D3D11CalcSubresource(0, i*numCubes+j, 1); + res = device->CreateRenderTargetView(Texture.Get(), &viewDesc, RenderTargetView[i][j].GetAddressOf()); + Utils::throwIfFailed(res); + } + + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = colorFormat; + srvDesc.TextureCubeArray.NumCubes = numCubes; + srvDesc.TextureCubeArray.First2DArrayFace = 0; + srvDesc.TextureCubeArray.MipLevels = 1; + srvDesc.TextureCubeArray.MostDetailedMip = 0; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; + res = device->CreateShaderResourceView(Texture.Get(), &srvDesc,ShaderResourceView.GetAddressOf()); + Utils::throwIfFailed(res); + D3D11_TEXTURE2D_DESC depthTexDesc = {}; + depthTexDesc.Width = resolution; + depthTexDesc.Height = resolution; + depthTexDesc.MipLevels = 1; + depthTexDesc.ArraySize = numCubes*6; + depthTexDesc.SampleDesc.Count = 1; + depthTexDesc.SampleDesc.Quality = 0; + depthTexDesc.Format = depthFormat; + depthTexDesc.Usage = D3D11_USAGE_DEFAULT; + depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + depthTexDesc.CPUAccessFlags = 0; + depthTexDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; + res = device->CreateTexture2D(&depthTexDesc, NULL, DepthStencilTexture.GetAddressOf()); + Utils::throwIfFailed(res); + + D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc = {}; + dsvDesc.Format = depthTexDesc.Format; + dsvDesc.Flags = 0; + dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; + dsvDesc.Texture2DArray.ArraySize = 1; + DepthStencilView.resize(numCubes); + for(int i = 0; i < numCubes - 1; i++) + for(int j = 0; j < 6; j++){ + dsvDesc.Texture2DArray.FirstArraySlice = D3D11CalcSubresource(0, i * numCubes + j, 1); + res = device->CreateDepthStencilView(DepthStencilTexture.Get(), &dsvDesc, DepthStencilView[i][j].GetAddressOf()); + Utils::throwIfFailed(res); + } + } + + RenderTargetCubeArray::RenderTargetCubeArray() : resolution(0), viewport(CreateViewport(resolution)),numCubes(0) { + + } + +} + diff --git a/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h new file mode 100644 index 000000000..abed4c143 --- /dev/null +++ b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h @@ -0,0 +1,35 @@ +#pragma once +#include +#include +#include +namespace T5M::Renderer { + using Microsoft::WRL::ComPtr; + using std::array; + using std::vector; + class RenderTargetCubeArray { + private: + static constexpr D3D11_VIEWPORT CreateViewport(size_t resolution) { + return { + 0, + 0, + static_cast(resolution), + static_cast(resolution), + 0, + 1, + + }; + } + public: + size_t numCubes; + size_t resolution; + D3D11_VIEWPORT viewport; + vector, 6>> RenderTargetView; + ComPtr ShaderResourceView; + ComPtr Texture; + vector, 6>> DepthStencilView; + ComPtr DepthStencilTexture; + RenderTargetCubeArray(); + RenderTargetCubeArray(ID3D11Device* device, size_t resolution,size_t arraySize, DXGI_FORMAT format, DXGI_FORMAT depthFormat = DXGI_FORMAT_D32_FLOAT); + + }; +} \ No newline at end of file diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index def8a7fc0..395c28b28 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -25,10 +25,12 @@ struct CAMERA_INFO; #include #include "ConstantBuffer/ConstantBuffer.h" +#include "RenderTargetCubeArray/RenderTargetCubeArray.h" namespace T5M::Renderer { - constexpr size_t SHADOW_MAP_SIZE = 512; + constexpr size_t MAX_DYNAMIC_SHADOWS = 1; + constexpr size_t SHADOW_MAP_SIZE = 256; using TexturePair = std::tuple; #define MESH_BITS(x) (1 << x) #define DX11_RELEASE(x) if (x != NULL) x->Release() @@ -447,6 +449,7 @@ namespace T5M::Renderer T5M::Renderer::Texture2D m_caustics[NUM_CAUSTICS_TEXTURES]; T5M::Renderer::Texture2D m_binocularsTexture; T5M::Renderer::Texture2D m_whiteTexture; + T5M::Renderer::RenderTargetCubeArray m_shadowMaps; // Level data T5M::Renderer::Texture2D m_titleScreen; diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index b8430ba88..774bf9009 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -66,7 +66,7 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h m_whiteTexture = Texture2D(m_device, L"WhiteSprite.png"); m_logo = Texture2D(m_device, L"Logo.png"); - + m_shadowMaps = RenderTargetCubeArray(m_device, SHADOW_MAP_SIZE, MAX_DYNAMIC_SHADOWS, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_D16_UNORM); // Load shaders ID3D10Blob * blob; @@ -355,7 +355,7 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, bool Renderer11::Create() { - D3D_FEATURE_LEVEL levels[1] = { D3D_FEATURE_LEVEL_10_0 }; + D3D_FEATURE_LEVEL levels[] = {D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_11_1}; D3D_FEATURE_LEVEL featureLevel; HRESULT res; @@ -364,9 +364,7 @@ bool Renderer11::Create() #else res = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, levels, 1, D3D11_SDK_VERSION, &m_device, &featureLevel, &m_context); // D3D11_CREATE_DEVICE_DEBUG #endif - - if (FAILED(res)) - return false; + Utils::throwIfFailed(res); return true; } diff --git a/TR5Main/Shaders/DX11_Rooms.fx b/TR5Main/Shaders/DX11_Rooms.fx index a1140dd49..f72bd058d 100644 --- a/TR5Main/Shaders/DX11_Rooms.fx +++ b/TR5Main/Shaders/DX11_Rooms.fx @@ -80,7 +80,7 @@ PixelShaderInput VS(VertexShaderInput input) } float2 texOffset(int u, int v) { - return float2(u * 1.0f / 512, v * 1.0f / 512); + return float2(u * 1.0f / 256, v * 1.0f / 256); } float4 PS(PixelShaderInput input) : SV_TARGET diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 7ddaa80ef..423e8a18d 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -331,6 +331,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -575,6 +576,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index 432f6927f..aa5218600 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -852,6 +852,9 @@ File di intestazione + + File di intestazione + @@ -1550,6 +1553,9 @@ File di origine + + File di origine + From a0d9a7914bb9bc27d769910d7cbdd7ebb9c3469d Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Sun, 2 Aug 2020 09:02:33 +0200 Subject: [PATCH 04/22] Prepareing RenderpipelineState, not-so-hardcoded shadow map size --- .../RenderPipelineState.cpp | 23 ++++++ .../RenderPipelineState/RenderPipelineState.h | 55 +++++++++++++++ TR5Main/Renderer/Renderer11.cpp | 70 ------------------- TR5Main/Renderer/Renderer11.h | 13 ++-- TR5Main/Renderer/Renderer11Init.cpp | 63 +++++++++-------- TR5Main/Renderer/Utils.cpp | 46 ++++++++++-- TR5Main/Renderer/Utils.h | 6 +- TR5Main/Shaders/DX11_Items.fx | 2 +- TR5Main/Shaders/DX11_Rooms.fx | 4 +- TR5Main/Specific/configuration.cpp | 11 ++- TR5Main/Specific/configuration.h | 2 + TR5Main/TR5Main.vcxproj | 2 + TR5Main/TR5Main.vcxproj.filters | 6 ++ TR5Main/framework.h | 1 + 14 files changed, 187 insertions(+), 117 deletions(-) create mode 100644 TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp create mode 100644 TR5Main/Renderer/RenderPipelineState/RenderPipelineState.h diff --git a/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp b/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp new file mode 100644 index 000000000..9e4d7cfe6 --- /dev/null +++ b/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp @@ -0,0 +1,23 @@ +#include "framework.h" +#include "RenderPipelineState.h" +#include "Utils.h" +namespace T5M::Renderer { + using namespace Utils; + RenderPipelineState::RenderPipelineState(ID3D11Device* device, const ShaderCompileOptions& vertexShader, const ShaderCompileOptions& pixelShader, const BlendStateOptions& blendingOptions) + { + this->vertexShader = compileVertexShader(device, vertexShader.fileName.c_str(), vertexShader.functionName.c_str(), vertexShader.profile.c_str(),nullptr, nullptr); + this->pixelShader = compilePixelShader(device, pixelShader.fileName.c_str(), pixelShader.functionName.c_str(), pixelShader.profile.c_str(), nullptr, nullptr); + D3D11_BLEND_DESC blndDesc = {}; + blndDesc.IndependentBlendEnable = blendingOptions.blendingEnabled; + blndDesc.AlphaToCoverageEnable = false; + blndDesc.RenderTarget[0].BlendEnable = blendingOptions.blendingEnabled; + blndDesc.RenderTarget[0].BlendOp = (D3D11_BLEND_OP)blendingOptions.blendFunction; + blndDesc.RenderTarget[0].SrcBlend = (D3D11_BLEND)blendingOptions.sourceColorFactor; + blndDesc.RenderTarget[0].SrcBlendAlpha = (D3D11_BLEND)blendingOptions.sourceAlphaFactor; + blndDesc.RenderTarget[0].DestBlend = (D3D11_BLEND)blendingOptions.destinationColorFactor; + blndDesc.RenderTarget[0].DestBlendAlpha = (D3D11_BLEND)blendingOptions.destinationAlphaFactor; + blndDesc.RenderTarget[0].RenderTargetWriteMask = 0xFF; + device->CreateBlendState(&blndDesc, this->blendState.GetAddressOf()); + } +} + diff --git a/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.h b/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.h new file mode 100644 index 000000000..bd3e6a963 --- /dev/null +++ b/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.h @@ -0,0 +1,55 @@ +#pragma once +#include +#include +namespace T5M::Renderer { + class RenderPipelineState; + struct ShaderCompileOptions { + std::wstring fileName; + std::string functionName; + std::string profile; + std::string source; + }; + + struct BlendStateOptions { + enum BlendFunction { + SRC_ADD_DST, + SRC_SUBTRACT_DST, + DST_SUBTRACT_SRC, + MIN, + MAX + }; + enum BlendFactor { + ZERO, + ONE, + SRC_COLOR, + INV_SRC_COLOR, + SRC_ALPHA, + INV_SRC_ALPHA, + DST_ALPHA, + INV_DST_ALPHA, + DST_COLOR, + INV_DST_COLOR, + ALPHA_SAT, + BLEND_FACTOR, + INV_BLEND_FACTOR, + }; + BlendFunction blendFunction; + BlendFactor sourceColorFactor; + BlendFactor sourceAlphaFactor; + BlendFactor destinationColorFactor; + BlendFactor destinationAlphaFactor; + bool blendingEnabled; + }; + using Microsoft::WRL::ComPtr; + class RenderPipelineState + { + private: + ComPtr inputLayout; + ComPtr vertexShader; + ComPtr pixelShader; + ComPtr blendState; + ComPtr depthState; + public: + RenderPipelineState(ID3D11Device* device, const ShaderCompileOptions& vertexShader, const ShaderCompileOptions& pixelShader, const BlendStateOptions& blendingOptions); + }; +} diff --git a/TR5Main/Renderer/Renderer11.cpp b/TR5Main/Renderer/Renderer11.cpp index 92c4f6b46..b4d283349 100644 --- a/TR5Main/Renderer/Renderer11.cpp +++ b/TR5Main/Renderer/Renderer11.cpp @@ -110,76 +110,6 @@ namespace T5M::Renderer { return nf; } - ID3D11VertexShader* Renderer11::compileVertexShader(const wchar_t* fileName, const char* function, const char* model, ID3D10Blob** bytecode) { - HRESULT res; - - *bytecode = NULL; - ID3DBlob* errors = NULL; - - printf("Compiling vertex shader: %s\n", fileName); - UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_SKIP_OPTIMIZATION; - res = D3DCompileFromFile(fileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, function, model, flags, 0, bytecode, &errors); - throwIfFailed(res); - - - ID3D11VertexShader* shader = NULL; - res = m_device->CreateVertexShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), NULL, &shader); - throwIfFailed(res); - - return shader; - } - - ID3D11PixelShader* Renderer11::compilePixelShader(const wchar_t* fileName, const char* function, const char* model, ID3D10Blob** bytecode) { - HRESULT res; - - *bytecode = NULL; - ID3DBlob* errors = NULL; - - printf("Compiling pixel shader: %s\n", fileName); - UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_SKIP_OPTIMIZATION; - throwIfFailed(D3DCompileFromFile(fileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, function, model, flags, 0, bytecode, &errors)); - - ID3D11PixelShader* shader = NULL; - throwIfFailed(m_device->CreatePixelShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), NULL, &shader)); - return shader; - } - - ID3D11GeometryShader* Renderer11::compileGeometryShader(const wchar_t* fileName) { - HRESULT res; - - ID3DBlob* bytecode = NULL; - ID3DBlob* errors = NULL; - - res = D3DCompileFromFile(fileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, NULL, "gs_4_0", D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, &bytecode, &errors); - if (FAILED(res)) - return NULL; - - ID3D11GeometryShader* shader = NULL; - res = m_device->CreateGeometryShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), NULL, &shader); - if (FAILED(res)) - return NULL; - - return shader; - } - - ID3D11ComputeShader* Renderer11::compileComputeShader(const wchar_t* fileName) { - HRESULT res; - - ID3DBlob* bytecode = NULL; - ID3DBlob* errors = NULL; - - res = D3DCompileFromFile(fileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, NULL, "gs_4_0", D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, &bytecode, &errors); - if (FAILED(res)) - return NULL; - - ID3D11ComputeShader* shader = NULL; - res = m_device->CreateComputeShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), NULL, &shader); - if (FAILED(res)) - return NULL; - - return shader; - } - void Renderer11::UpdateProgress(float value) { m_progress = value; } diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index 395c28b28..d2ac43a65 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -30,7 +30,6 @@ struct CAMERA_INFO; namespace T5M::Renderer { constexpr size_t MAX_DYNAMIC_SHADOWS = 1; - constexpr size_t SHADOW_MAP_SIZE = 256; using TexturePair = std::tuple; #define MESH_BITS(x) (1 << x) #define DX11_RELEASE(x) if (x != NULL) x->Release() @@ -535,12 +534,7 @@ namespace T5M::Renderer int m_pickupRotation; // Private functions - bool drawScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, CCameraMatrixBuffer& camera); bool drawAllStrings(); - ID3D11VertexShader* compileVertexShader(const wchar_t * fileName, const char* function, const char* model, ID3D10Blob** bytecode); - ID3D11GeometryShader* compileGeometryShader(const wchar_t * fileName); - ID3D11PixelShader* compilePixelShader(const wchar_t * fileName, const char* function, const char* model, ID3D10Blob** bytecode); - ID3D11ComputeShader* compileComputeShader(const wchar_t * fileName); int getAnimatedTextureInfo(short textureId); void initialiseHairRemaps(); RendererMesh* getRendererMeshFromTrMesh(RendererObject* obj, MESH* meshPtr, short boneIndex, int isJoints, int isHairs); @@ -628,7 +622,12 @@ namespace T5M::Renderer int ScreenHeight; bool Windowed; int NumTexturePages; - + ID3D11Device* getDevice() const { + return m_device; + } + ID3D11DeviceContext* getContext() const { + return m_context; + }; Renderer11(); ~Renderer11(); diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 774bf9009..1ead12473 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -4,6 +4,7 @@ #include "winmain.h" #include "GameFlowScript.h" #include "Quad/RenderQuad.h" +#include using namespace T5M::Renderer; using std::vector; extern GameConfiguration g_Configuration; @@ -66,11 +67,14 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h m_whiteTexture = Texture2D(m_device, L"WhiteSprite.png"); m_logo = Texture2D(m_device, L"Logo.png"); - m_shadowMaps = RenderTargetCubeArray(m_device, SHADOW_MAP_SIZE, MAX_DYNAMIC_SHADOWS, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_D16_UNORM); + m_shadowMaps = RenderTargetCubeArray(m_device, g_Configuration.shadowMapSize, MAX_DYNAMIC_SHADOWS, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_D16_UNORM); // Load shaders ID3D10Blob * blob; - - m_vsRooms = compileVertexShader(L"Shaders\\DX11_Rooms.fx", "VS", "vs_4_0", &blob); + //char shadowMapStringBuff[4]; + //_itoa(g_Configuration.shadowMapSize, shadowMapStringBuff,10); + std::string shadowSizeString = std::to_string(g_Configuration.shadowMapSize); + const D3D_SHADER_MACRO roomDefines[] = {"SHADOW_MAP_SIZE",shadowSizeString.c_str(),nullptr,nullptr}; + m_vsRooms = Utils::compileVertexShader(m_device,L"Shaders\\DX11_Rooms.fx", "VS", "vs_4_0", &roomDefines[0], &blob); // Initialise input layout using the first vertex shader D3D11_INPUT_ELEMENT_DESC inputLayout[] = @@ -86,29 +90,31 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h m_inputLayout = NULL; Utils::throwIfFailed(m_device->CreateInputLayout(inputLayout, 7, blob->GetBufferPointer(), blob->GetBufferSize(), &m_inputLayout)); - m_psRooms = compilePixelShader(L"Shaders\\DX11_Rooms.fx", "PS", "ps_4_0", &blob); - m_vsItems = compileVertexShader(L"Shaders\\DX11_Items.fx", "VS", "vs_4_0", &blob); - m_psItems = compilePixelShader(L"Shaders\\DX11_Items.fx", "PS", "ps_4_0", &blob); - m_vsStatics = compileVertexShader(L"Shaders\\DX11_Statics.fx", "VS", "vs_4_0", &blob); - m_psStatics = compilePixelShader(L"Shaders\\DX11_Statics.fx", "PS", "ps_4_0", &blob); - m_vsHairs = compileVertexShader(L"Shaders\\DX11_Hairs.fx", "VS", "vs_4_0", &blob); - m_psHairs = compilePixelShader(L"Shaders\\DX11_Hairs.fx", "PS", "ps_4_0", &blob); - m_vsSky = compileVertexShader(L"Shaders\\DX11_Sky.fx", "VS", "vs_4_0", &blob); - m_psSky = compilePixelShader(L"Shaders\\DX11_Sky.fx", "PS", "ps_4_0", &blob); - m_vsSprites = compileVertexShader(L"Shaders\\DX11_Sprites.fx", "VS", "vs_4_0", &blob); - m_psSprites = compilePixelShader(L"Shaders\\DX11_Sprites.fx", "PS", "ps_4_0", &blob); - m_vsSolid = compileVertexShader(L"Shaders\\DX11_Solid.fx", "VS", "vs_4_0", &blob); - m_psSolid = compilePixelShader(L"Shaders\\DX11_Solid.fx", "PS", "ps_4_0", &blob); - m_vsInventory = compileVertexShader(L"Shaders\\DX11_Inventory.fx", "VS", "vs_4_0", &blob); - m_psInventory = compilePixelShader(L"Shaders\\DX11_Inventory.fx", "PS", "ps_4_0", &blob); - m_vsFullScreenQuad = compileVertexShader(L"Shaders\\DX11_FullScreenQuad.fx", "VS", "vs_4_0", &blob); - m_psFullScreenQuad = compilePixelShader(L"Shaders\\DX11_FullScreenQuad.fx", "PS", "ps_4_0", &blob); - m_vsShadowMap = compileVertexShader(L"Shaders\\DX11_ShadowMap.fx", "VS", "vs_4_0", &blob); - m_psShadowMap = compilePixelShader(L"Shaders\\DX11_ShadowMap.fx", "PS", "ps_4_0", &blob); - m_vsHUD = compileVertexShader(L"Shaders\\HUD\\DX11_VS_HUD.hlsl", "VS", "vs_4_0", &blob); - m_psHUDColor = compilePixelShader(L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSColored", "ps_4_0", &blob); - m_psHUDTexture = compilePixelShader(L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSTextured", "ps_4_0", &blob); - m_psHUDBarColor = compilePixelShader(L"Shaders\\HUD\\DX11_PS_HUDBar.hlsl", "PSColored", "ps_4_0", &blob); + + m_psRooms = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Rooms.fx", "PS", "ps_4_0", &roomDefines[0], &blob); + m_vsItems = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Items.fx", "VS", "vs_4_0", nullptr, &blob); + m_psItems = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Items.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsStatics = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Statics.fx", "VS", "vs_4_0", nullptr, &blob); + m_psStatics = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Statics.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsHairs = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Hairs.fx", "VS", "vs_4_0", nullptr, &blob); + m_psHairs = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Hairs.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsSky = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Sky.fx", "VS", "vs_4_0", nullptr, &blob); + m_psSky = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Sky.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsSprites = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Sprites.fx", "VS", "vs_4_0", nullptr, &blob); + m_psSprites = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Sprites.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsSolid = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Solid.fx", "VS", "vs_4_0", nullptr, &blob); + m_psSolid = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Solid.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsInventory = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Inventory.fx", "VS", "vs_4_0",nullptr, &blob); + m_psInventory = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Inventory.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsFullScreenQuad = Utils::compileVertexShader(m_device, L"Shaders\\DX11_FullScreenQuad.fx", "VS", "vs_4_0",nullptr, &blob); + m_psFullScreenQuad = Utils::compilePixelShader(m_device, L"Shaders\\DX11_FullScreenQuad.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsShadowMap = Utils::compileVertexShader(m_device, L"Shaders\\DX11_ShadowMap.fx", "VS", "vs_4_0", nullptr, &blob); + m_psShadowMap = Utils::compilePixelShader(m_device, L"Shaders\\DX11_ShadowMap.fx", "PS", "ps_4_0", nullptr, &blob); + m_vsHUD = Utils::compileVertexShader(m_device, L"Shaders\\HUD\\DX11_VS_HUD.hlsl", "VS", "vs_4_0", nullptr, &blob); + m_psHUDColor = Utils::compilePixelShader(m_device, L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSColored", "ps_4_0", nullptr, &blob); + m_psHUDTexture = Utils::compilePixelShader(m_device,L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSTextured", "ps_4_0", nullptr, &blob); + m_psHUDBarColor = Utils::compilePixelShader(m_device,L"Shaders\\HUD\\DX11_PS_HUDBar.hlsl", "PSColored", "ps_4_0", nullptr, &blob); + m_shadowMap = RenderTarget2D(m_device, g_Configuration.shadowMapSize, g_Configuration.shadowMapSize, DXGI_FORMAT_R32_FLOAT,DXGI_FORMAT_D16_UNORM); // Initialise constant buffers m_cbCameraMatrices = createConstantBuffer(); @@ -274,7 +280,6 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, // Initialise buffers m_renderTarget = RenderTarget2D(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); m_dumpScreenRenderTarget = RenderTarget2D(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - m_shadowMap = RenderTarget2D(m_device, SHADOW_MAP_SIZE, SHADOW_MAP_SIZE, DXGI_FORMAT_R32_FLOAT); m_reflectionCubemap = RenderTargetCube(m_device, 128, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB); // Shadow map /*D3D11_TEXTURE2D_DESC depthTexDesc; @@ -326,8 +331,8 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, m_shadowMapViewport.TopLeftX = 0; m_shadowMapViewport.TopLeftY = 0; - m_shadowMapViewport.Width = SHADOW_MAP_SIZE; - m_shadowMapViewport.Height = SHADOW_MAP_SIZE; + m_shadowMapViewport.Width = g_Configuration.shadowMapSize; + m_shadowMapViewport.Height = g_Configuration.shadowMapSize; m_shadowMapViewport.MinDepth = 0.0f; m_shadowMapViewport.MaxDepth = 1.0f; diff --git a/TR5Main/Renderer/Utils.cpp b/TR5Main/Renderer/Utils.cpp index 451db1d82..bba86b784 100644 --- a/TR5Main/Renderer/Utils.cpp +++ b/TR5Main/Renderer/Utils.cpp @@ -1,9 +1,47 @@ #include "framework.h" #include "Utils.h" #include +namespace T5M::Renderer::Utils { + using std::wstring; + using std::string; + void Utils::throwIfFailed(const HRESULT& res) noexcept { + if(FAILED(res)) + throw std::exception("An error occured!"); + } -void T5M::Renderer::Utils::throwIfFailed(const HRESULT& res) -{ - if (FAILED(res)) - throw std::exception("An error occured!"); + ID3D11VertexShader* compileVertexShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ID3D10Blob** bytecode) { + HRESULT res; + + *bytecode = nullptr; + ID3DBlob* errors = nullptr; + logD("Compiling vertex shader"); + res = D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode, &errors); + throwIfFailed(res); + ID3D11VertexShader* shader = nullptr; + res = device->CreateVertexShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), nullptr, &shader); + throwIfFailed(res); + return shader; + } + ID3D11PixelShader* compilePixelShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ID3D10Blob** bytecode) noexcept { + HRESULT res; + + *bytecode = nullptr; + ID3DBlob* errors = nullptr; + logD("Compiling pixel shader"); + UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_SKIP_OPTIMIZATION; + throwIfFailed(D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode, &errors)); + ID3D11PixelShader* shader = nullptr; + throwIfFailed(device->CreatePixelShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), nullptr, &shader)); + return shader; + } + UINT Utils::GetShaderFlags() + { + UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR; + if constexpr(DebugBuild){ + flags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION; + } else{ + flags |= D3DCOMPILE_OPTIMIZATION_LEVEL3 | D3DCOMPILE_IEEE_STRICTNESS; + } + return flags; + } } diff --git a/TR5Main/Renderer/Utils.h b/TR5Main/Renderer/Utils.h index 2dc1b6dba..2a7460230 100644 --- a/TR5Main/Renderer/Utils.h +++ b/TR5Main/Renderer/Utils.h @@ -1,11 +1,15 @@ #pragma once #include +#include namespace T5M { namespace Renderer { namespace Utils { //throws a std::exception when the result contains a FAILED result //In most cases we cannot run the game if some Direct3D operation failed - void throwIfFailed(const HRESULT& res); + void throwIfFailed(const HRESULT& res) noexcept; + ID3D11VertexShader* compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ID3D10Blob** bytecode); + UINT GetShaderFlags(); + ID3D11PixelShader* compilePixelShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ID3D10Blob** bytecode) noexcept; } } } \ No newline at end of file diff --git a/TR5Main/Shaders/DX11_Items.fx b/TR5Main/Shaders/DX11_Items.fx index 5af3274eb..c6bc99426 100644 --- a/TR5Main/Shaders/DX11_Items.fx +++ b/TR5Main/Shaders/DX11_Items.fx @@ -83,7 +83,7 @@ float4 PS(PixelShaderInput input) : SV_TARGET if (AlphaTest) clip(output.w - 0.5f); - float3 lighting = AmbientLight.xyz * 2.0f; + float3 lighting = AmbientLight.xyz; float4 reflectionColor = Reflection.Sample(Sampler,input.ReflectionVector.xyz); for (int i = 0; i < NumLights; i++) { diff --git a/TR5Main/Shaders/DX11_Rooms.fx b/TR5Main/Shaders/DX11_Rooms.fx index f72bd058d..9e227fc4c 100644 --- a/TR5Main/Shaders/DX11_Rooms.fx +++ b/TR5Main/Shaders/DX11_Rooms.fx @@ -80,7 +80,7 @@ PixelShaderInput VS(VertexShaderInput input) } float2 texOffset(int u, int v) { - return float2(u * 1.0f / 256, v * 1.0f / 256); + return float2(u * 1.0f / SHADOW_MAP_SIZE, v * 1.0f / SHADOW_MAP_SIZE); } float4 PS(PixelShaderInput input) : SV_TARGET @@ -123,7 +123,7 @@ float4 PS(PixelShaderInput input) : SV_TARGET } float shadowFactor = sum / 16.0; - lighting = lerp(lighting, min(AmbientColor*2,lighting), 1-saturate(shadowFactor)); + lighting = lerp(lighting, min(AmbientColor,lighting), 1-saturate(shadowFactor)); } } diff --git a/TR5Main/Specific/configuration.cpp b/TR5Main/Specific/configuration.cpp index 9611f3c91..ec134dda4 100644 --- a/TR5Main/Specific/configuration.cpp +++ b/TR5Main/Specific/configuration.cpp @@ -285,8 +285,12 @@ bool SaveConfiguration() return false; } - if (SetDWORDRegKey(rootKey, REGKEY_REFRESH_RATE, g_Configuration.RefreshRate) != ERROR_SUCCESS) - { + if(SetDWORDRegKey(rootKey, REGKEY_REFRESH_RATE, g_Configuration.RefreshRate) != ERROR_SUCCESS){ + RegCloseKey(rootKey); + return false; + } + + if(SetDWORDRegKey(rootKey, REGKEY_SHADOW_MAP, g_Configuration.shadowMapSize) != ERROR_SUCCESS){ RegCloseKey(rootKey); return false; } @@ -327,6 +331,7 @@ void InitDefaultConfiguration() g_Configuration.SfxVolume = 100; g_Configuration.Width = 1366; g_Configuration.Height = 768; + g_Configuration.shadowMapSize = 512; } bool LoadConfiguration() @@ -462,7 +467,7 @@ bool LoadConfiguration() g_Configuration.SfxVolume = sfxVolume; g_Configuration.RefreshRate = refreshRate; g_Configuration.SoundDevice = soundDevice; - + g_Configuration.shadowMapSize = 512; // Set legacy variables //OptionAutoTarget = autoTarget; GlobalMusicVolume = musicVolume; diff --git a/TR5Main/Specific/configuration.h b/TR5Main/Specific/configuration.h index 6e1d0badb..58221cb74 100644 --- a/TR5Main/Specific/configuration.h +++ b/TR5Main/Specific/configuration.h @@ -48,6 +48,7 @@ #define REGKEY_JWLK "JWlk" #define REGKEY_REFRESH_RATE "RefreshRate" #define REGKEY_SOUND_DEVICE "SoundDevice" +#define REGKEY_SHADOW_MAP "ShadowMap" typedef struct GameConfiguration { int Width; @@ -77,6 +78,7 @@ typedef struct GameConfiguration { int JoyLook; int JoyRoll; int JoyWalk; + int shadowMapSize = 1024; }; void LoadResolutionsInCombobox(HWND handle, int index); diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 423e8a18d..8dbcce489 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -332,6 +332,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -577,6 +578,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index aa5218600..dac359605 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -855,6 +855,9 @@ File di intestazione + + File di intestazione + @@ -1556,6 +1559,9 @@ File di origine + + File di origine + diff --git a/TR5Main/framework.h b/TR5Main/framework.h index 533cbe0e3..8ba6ada71 100644 --- a/TR5Main/framework.h +++ b/TR5Main/framework.h @@ -44,6 +44,7 @@ #include "bass_fx.h" #include "sol.hpp" #include "memory/malloc.h" +#include "Game/debug/debug.h" using namespace DirectX; using namespace DirectX::SimpleMath; From 4780445da28af54f9038f08174b0816e4baf774a Mon Sep 17 00:00:00 2001 From: Sezz Date: Sat, 8 Aug 2020 18:27:19 +1000 Subject: [PATCH 05/22] Lara no longer smacks into the wall when crawling to a hang. Lara no longer leans into walls. Some minor cleanup here and there. --- TR5Main/Game/lara.cpp | 215 +++++++++++++++++++------------------ TR5Main/Game/lara.h | 4 +- TR5Main/Game/lara_struct.h | 7 +- TR5Main/Game/laraclmb.cpp | 20 ++-- 4 files changed, 126 insertions(+), 120 deletions(-) diff --git a/TR5Main/Game/lara.cpp b/TR5Main/Game/lara.cpp index 295c5e4d6..7c119c792 100644 --- a/TR5Main/Game/lara.cpp +++ b/TR5Main/Game/lara.cpp @@ -31,7 +31,9 @@ #include "upv.h" #include "kayak.h" #include "minecart.h" + using std::function; + static short LeftClimbTab[4] = // offset 0xA0638 { 0x0200, 0x0400, 0x0800, 0x0100 @@ -44,16 +46,23 @@ static short RightClimbTab[4] = // offset 0xA0640 extern Inventory g_Inventory; -short elevation = 57346; -bool doJump = false; +short Elevation = 57346; +bool DoJump = false; short OldAngle = 1; int RopeSwing = 0; LaraInfo Lara; ITEM_INFO* LaraItem; byte LaraNodeUnderwater[NUM_LARA_MESHES]; -bool EnableCrouchRoll, EnableFeetHang, EnableMonkeyVault, EnableMonkeyRoll, EnableCrawlFlex1click, EnableCrawlFlex2click, EnableCrawlFlex3click; -bool EnableCrawlFlex1clickE, EnableCrawlFlex2clickE, EnableCrawlFlex3clickE, EnableCrawlFlex1clickup, EnableCrawlFlex1clickdown; -bool TR12_OSCILLATE_HANG; + +// Temp. +bool EnableCrouchRoll = true; +bool EnableHangFeet; +bool EnableAutoJumpUpToMonkey = true; +bool EnableMonkeyTurn180 = true; +bool EnableVaultToCrouch1click = true, EnableVaultToCrouch2click = true, EnableVaultToCrouch3click = true; +bool EnableCrawlJumpDown1click = true, EnableCrawlJumpDown2click = true, EnableCrawlJumpDown3click = true; +bool EnableCrawlUpStep = true, EnableCrawlDownStep = true; +bool EnableReachToHangOscillate = true; function lara_control_routines[NUM_LARA_STATES + 1] = { lara_as_walk, @@ -1843,9 +1852,12 @@ void lara_as_wade(ITEM_INFO* item, COLL_INFO* coll)//1AF10, 1B044 (F) if (Lara.turnRate < -(LARA_FAST_TURN >> 1)) Lara.turnRate = -(LARA_FAST_TURN >> 1); - item->pos.zRot -= LARA_LEAN_RATE; - if (item->pos.zRot < -(LARA_LEAN_MAX >> 1)) - item->pos.zRot = -(LARA_LEAN_MAX >> 1); + if (TestLaraLean(item, coll)) + { + item->pos.zRot -= LARA_LEAN_RATE; + if (item->pos.zRot < -(LARA_LEAN_MAX >> 1)) + item->pos.zRot = -(LARA_LEAN_MAX >> 1); + } } else if (TrInput & IN_RIGHT) { @@ -1853,9 +1865,12 @@ void lara_as_wade(ITEM_INFO* item, COLL_INFO* coll)//1AF10, 1B044 (F) if (Lara.turnRate > (LARA_FAST_TURN >> 1)) Lara.turnRate = (LARA_FAST_TURN >> 1); - item->pos.zRot += LARA_LEAN_RATE; - if (item->pos.zRot > (LARA_LEAN_MAX >> 1)) - item->pos.zRot = (LARA_LEAN_MAX >> 1); + if (TestLaraLean(item, coll)) + { + item->pos.zRot += LARA_LEAN_RATE; + if (item->pos.zRot > (LARA_LEAN_MAX >> 1)) + item->pos.zRot = (LARA_LEAN_MAX >> 1); + } } if (TrInput & IN_FORWARD) @@ -1871,9 +1886,12 @@ void lara_as_wade(ITEM_INFO* item, COLL_INFO* coll)//1AF10, 1B044 (F) if (Lara.turnRate < -LARA_FAST_TURN) Lara.turnRate = -LARA_FAST_TURN; - item->pos.zRot -= LARA_LEAN_RATE; - if (item->pos.zRot < -LARA_LEAN_MAX) - item->pos.zRot = -LARA_LEAN_MAX; + if (TestLaraLean(item, coll)) + { + item->pos.zRot -= LARA_LEAN_RATE; + if (item->pos.zRot < -LARA_LEAN_MAX) + item->pos.zRot = -LARA_LEAN_MAX; + } } else if (TrInput & IN_RIGHT) { @@ -1881,9 +1899,12 @@ void lara_as_wade(ITEM_INFO* item, COLL_INFO* coll)//1AF10, 1B044 (F) if (Lara.turnRate > LARA_FAST_TURN) Lara.turnRate = LARA_FAST_TURN; - item->pos.zRot += LARA_LEAN_RATE; - if (item->pos.zRot > LARA_LEAN_MAX) - item->pos.zRot = LARA_LEAN_MAX; + if (TestLaraLean(item, coll)) + { + item->pos.zRot += LARA_LEAN_RATE; + if (item->pos.zRot > LARA_LEAN_MAX) + item->pos.zRot = LARA_LEAN_MAX; + } } if (TrInput & IN_FORWARD) @@ -2732,6 +2753,21 @@ void lara_as_fastback(ITEM_INFO* item, COLL_INFO* coll)//1959C(<), 196D0(<) (F) } } +bool TestLaraLean(ITEM_INFO* item, COLL_INFO* coll) +{ + // TODO: make it more fine-tuned when new collision is done. + switch (coll->collType) + { + case CT_RIGHT: + if (TrInput & IN_RIGHT) + return false; + case CT_LEFT: + if (TrInput & IN_LEFT) + return false; + } + return true; +} + void lara_as_run(ITEM_INFO* item, COLL_INFO* coll)//192EC, 19420 (F) { if (item->hitPoints <= 0) @@ -2774,9 +2810,12 @@ void lara_as_run(ITEM_INFO* item, COLL_INFO* coll)//192EC, 19420 (F) if (Lara.turnRate < -LARA_FAST_TURN) Lara.turnRate = -LARA_FAST_TURN; - item->pos.zRot -= LARA_LEAN_RATE; - if (item->pos.zRot < -LARA_LEAN_MAX) - item->pos.zRot = -LARA_LEAN_MAX; + if (TestLaraLean(item, coll)) + { + item->pos.zRot -= LARA_LEAN_RATE; + if (item->pos.zRot < -LARA_LEAN_MAX) + item->pos.zRot = -LARA_LEAN_MAX; + } } else if (TrInput & IN_RIGHT) { @@ -2784,26 +2823,29 @@ void lara_as_run(ITEM_INFO* item, COLL_INFO* coll)//192EC, 19420 (F) if (Lara.turnRate > LARA_FAST_TURN) Lara.turnRate = LARA_FAST_TURN; - item->pos.zRot += LARA_LEAN_RATE; - if (item->pos.zRot > LARA_LEAN_MAX) - item->pos.zRot = LARA_LEAN_MAX; + if (TestLaraLean(item, coll)) + { + item->pos.zRot += LARA_LEAN_RATE; + if (item->pos.zRot > LARA_LEAN_MAX) + item->pos.zRot = LARA_LEAN_MAX; + } } if (item->animNumber == LA_STAND_TO_RUN) { - doJump = false; + DoJump = false; } else if (item->animNumber == LA_RUN) { if (item->frameNumber == 4) - doJump = true; + DoJump = true; } else { - doJump = true; + DoJump = true; } - if (TrInput & IN_JUMP && doJump && !item->gravityStatus) + if (TrInput & IN_JUMP && DoJump && !item->gravityStatus) { item->goalAnimState = LS_JUMP_FORWARD; } @@ -2878,9 +2920,6 @@ void lara_col_reach(ITEM_INFO* item, COLL_INFO* coll)//18D0C, 18E40 (F) if (Lara.ropePtr == -1) item->gravityStatus = true; - - - Lara.moveAngle = item->pos.yRot; coll->badPos = NO_BAD_POS; @@ -2975,7 +3014,7 @@ void lara_col_reach(ITEM_INFO* item, COLL_INFO* coll)//18D0C, 18E40 (F) { if (TestHangSwingIn(item, angle)) { - if (TR12_OSCILLATE_HANG == true) + if (EnableReachToHangOscillate) { Lara.headYrot = 0; Lara.headXrot = 0; @@ -4125,10 +4164,6 @@ void lara_col_hang2(ITEM_INFO* item, COLL_INFO* coll)//163DC, 16510 (F) GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 600); - // FOR DEBUG PURPOSES UNTIL SCRIPTING IS READY- - EnableMonkeyRoll = true; - - if (TrInput & IN_FORWARD && coll->collType != CT_FRONT && abs(coll->midCeiling - coll->frontCeiling) < 50) { item->goalAnimState = LS_MONKEYSWING_FORWARD; @@ -4149,7 +4184,7 @@ void lara_col_hang2(ITEM_INFO* item, COLL_INFO* coll)//163DC, 16510 (F) { item->goalAnimState = LS_MONKEYSWING_TURN_RIGHT; } - else if ((TrInput & IN_ROLL) && EnableMonkeyRoll == true) + else if ((TrInput & IN_ROLL) && EnableMonkeyTurn180) { item->currentAnimState = LS_MONKEYSWING_TURN_180; item->goalAnimState = LS_MONKEYSWING_IDLE; @@ -4585,29 +4620,28 @@ void lara_col_crawl2hang(ITEM_INFO* item, COLL_INFO* coll)//15770, 158A4 (F) if (TestHangSwingIn(item, angle)) { - - Lara.headYrot = 0; - Lara.headXrot = 0; - Lara.torsoYrot = 0; - Lara.torsoXrot = 0; - item->animNumber = LA_JUMP_UP_TO_MONKEYSWING; - item->frameNumber = g_Level.Anims[item->animNumber].frameBase; - item->currentAnimState = LS_MONKEYSWING_IDLE; - item->goalAnimState = LS_MONKEYSWING_IDLE; + Lara.headYrot = 0; + Lara.headXrot = 0; + Lara.torsoYrot = 0; + Lara.torsoXrot = 0; + item->animNumber = LA_JUMP_UP_TO_MONKEYSWING; + item->frameNumber = g_Level.Anims[item->animNumber].frameBase; + item->currentAnimState = LS_MONKEYSWING_IDLE; + item->goalAnimState = LS_MONKEYSWING_IDLE; } else { if (TestHangFeet(item, angle)) { item->animNumber = LA_REACH_TO_HANG; - item->frameNumber = g_Level.Anims[item->animNumber].frameBase; + item->frameNumber = g_Level.Anims[item->animNumber].frameBase + 12; item->currentAnimState = LS_HANG; item->goalAnimState = LS_HANG_FEET; } else { item->animNumber = LA_REACH_TO_HANG; - item->frameNumber = g_Level.Anims[item->animNumber].frameBase; + item->frameNumber = g_Level.Anims[item->animNumber].frameBase + 12; item->currentAnimState = LS_HANG; item->goalAnimState = LS_HANG; } @@ -5047,17 +5081,6 @@ void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)//14970, 14A78 (F) return; } - // FOR DEBUG PURPOSES UNTIL SCRIPTING IS FINISHED - EnableCrawlFlex1clickdown = true; - EnableCrawlFlex1clickup = true; - EnableCrawlFlex3clickE = true; - EnableCrawlFlex2clickE = true; - EnableCrawlFlex1clickE = true; - - - - - if (TrInput & IN_JUMP) { GAME_VECTOR s, d; @@ -5104,7 +5127,7 @@ void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)//14970, 14A78 (F) d.y = s.y + 160; d.z = s.z + (768 * phd_cos(LaraItem->pos.yRot) >> W2V_SHIFT); - if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && EnableCrawlFlex3clickE == true) + if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && EnableCrawlJumpDown3click) { item->animNumber = LA_CRAWL_JUMP_DOWN_23CLICK; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; @@ -5128,7 +5151,7 @@ void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)//14970, 14A78 (F) d.y = s.y + 160; d.z = s.z + (768 * phd_cos(LaraItem->pos.yRot) >> W2V_SHIFT); - if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && EnableCrawlFlex2clickE == true) + if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && EnableCrawlJumpDown2click) { item->animNumber = LA_CRAWL_JUMP_DOWN_23CLICK; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; @@ -5151,7 +5174,7 @@ void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)//14970, 14A78 (F) d.y = s.y + 160; d.z = s.z + (768 * phd_cos(LaraItem->pos.yRot) >> W2V_SHIFT); - if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && EnableCrawlFlex1clickE == true) + if (LOS(&s, &d) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE && EnableCrawlJumpDown1click) { item->animNumber = LA_CRAWL_JUMP_DOWN_1CLICK; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; @@ -5164,12 +5187,12 @@ void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)//14970, 14A78 (F) } - if ((TrInput & IN_ACTION) && (TrInput & IN_FORWARD) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE) + if (/*(TrInput & IN_ACTION) &&*/ (TrInput & IN_FORWARD) && item->animNumber != LA_CROUCH_TO_CRAWL_START && item->animNumber != LA_CROUCH_TO_CRAWL_CONTINUE) { if (LaraFloorFront(item, item->pos.yRot, 256) == -256 && LaraCeilingFront(item, item->pos.yRot, 256, 256) != NO_HEIGHT && LaraCeilingFront(item, item->pos.yRot, 256, 256) <= -512 && - EnableCrawlFlex1clickup == true) + EnableCrawlUpStep) { item->animNumber = LA_CRAWL_UP_STEP; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; @@ -5180,7 +5203,7 @@ void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)//14970, 14A78 (F) if (LaraFloorFront(item, item->pos.yRot, 256) == 256 && LaraCeilingFront(item, item->pos.yRot, 256, 256) != NO_HEIGHT && LaraCeilingFront(item, item->pos.yRot, 256, -256) <= -512 && - EnableCrawlFlex1clickdown == true) + EnableCrawlDownStep) { item->animNumber = LA_CRAWL_DOWN_STEP; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; @@ -5283,10 +5306,6 @@ void lara_as_duck(ITEM_INFO* item, COLL_INFO* coll)//14688, 14738 (F) GetFloor(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos, &roomNum); - // FOR DEBUG PURPOSES UNTIL SCRIPTING IS FINISHED- - EnableCrouchRoll = true; - - if ((TrInput & IN_FORWARD || TrInput & IN_BACK) && (TrInput & IN_DUCK || Lara.keepDucked) && Lara.gunStatus == LG_NO_ARMS @@ -5306,7 +5325,9 @@ void lara_as_duck(ITEM_INFO* item, COLL_INFO* coll)//14688, 14738 (F) } } - else if ((TrInput & IN_SPRINT) /*crouch roll*/ + + // Crouch roll + else if ((TrInput & IN_SPRINT) && (TrInput & IN_DUCK || Lara.keepDucked) && Lara.gunStatus == LG_NO_ARMS && Lara.waterStatus != LW_WADE @@ -5314,13 +5335,13 @@ void lara_as_duck(ITEM_INFO* item, COLL_INFO* coll)//14688, 14738 (F) && !(Lara.waterSurfaceDist > 256) && EnableCrouchRoll == true) { - if (LaraFloorFront(item, item->pos.yRot, 1024) >= 384 || //4 clicks away from holes in the floor - TestWall(item, 1024, 0, -256)) //4 clicks away from walls + // Don't roll if 1 block away from a hole in the floor OR 1 block away from a wall. + if (LaraFloorFront(item, item->pos.yRot, 1024) >= 384 + || TestWall(item, 1024, 0, -256)) return; - if (!(TrInput & IN_FLARE || TrInput & IN_DRAW) //avoids some flare spawning/wep stuff + if (!(TrInput & IN_FLARE || TrInput & IN_DRAW) // Avoids some flare spawning/wep stuff. && (Lara.gunType != WEAPON_FLARE || Lara.flareAge < 900 && Lara.flareAge != 0)) - { Lara.torsoYrot = 0; Lara.torsoXrot = 0; @@ -5418,9 +5439,6 @@ int TestHangSwingIn(ITEM_INFO* item, short angle)//14104, 141B4 (F) FLOOR_INFO* floor; int h, c; - //debug till scripting be ready -// TR12_OSCILLATE_HANG = true; - if (angle == ANGLE(180.0f)) { z -= 256; @@ -5444,7 +5462,7 @@ int TestHangSwingIn(ITEM_INFO* item, short angle)//14104, 141B4 (F) if (h != NO_HEIGHT) { - if (TR12_OSCILLATE_HANG == true) + if (EnableReachToHangOscillate) { if (((h - y) > 0) && ((c - y) < -400)) @@ -5986,10 +6004,13 @@ void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F) switch (coll->collType) { + + // TODO: handle new wall-collide-near-ground anims here. Bookmarking for later. case CT_FRONT: case CT_TOP_FRONT: if (!Lara.climbStatus || item->speed != 2) { + // Jump anim continues between 512 and 128, x/y/z posions locked. if (coll->midFloor <= 512) { if (coll->midFloor <= 128) @@ -6204,19 +6225,16 @@ int LaraTestClimbStance(ITEM_INFO* item, COLL_INFO* coll)//11F78, 12028 if (LaraTestClimbPos(item, coll->radius, -(coll->radius + 120), -700, 512, &shift_l) != 1) return false; - if (shift_r) + if (shift_r && shift_l) { - if (shift_l) - { - if (shift_r < 0 != shift_l < 0) - return false; + if (shift_r < 0 != shift_l < 0) + return false; - if ((shift_r < 0 && shift_l < shift_r) || - (shift_r > 0 && shift_l > shift_r)) - { - item->pos.yPos += shift_l; - return true; - } + if ((shift_r < 0 && shift_l < shift_r) || + (shift_r > 0 && shift_l > shift_r)) + { + item->pos.yPos += shift_l; + return true; } item->pos.yPos += shift_r; @@ -6413,14 +6431,6 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) if (!(TrInput & IN_ACTION) || Lara.gunStatus != LG_NO_ARMS) return 0; - // FOR DEBUG PURPOSES UNTIL SCRPTING IS FINISHED- - EnableCrawlFlex1click = true; - EnableCrawlFlex2click = true; - EnableCrawlFlex3click = true; - EnableMonkeyVault = true; - - - if (coll->collType == CT_FRONT) { short angle = item->pos.yRot; @@ -6440,7 +6450,7 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) if (coll->frontFloor < 0 && coll->frontFloor >= -256) { - if (!slope && (abs(coll->frontCeiling - coll->frontFloor) < 256) && EnableCrawlFlex1click == true) + if (!slope && (abs(coll->frontCeiling - coll->frontFloor) < 256) && EnableVaultToCrouch1click) { item->animNumber = LA_VAULT_TO_CROUCH_1CLICK; item->currentAnimState = LS_GRABBING; @@ -6469,7 +6479,7 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) item->pos.yPos += coll->frontFloor + 512; Lara.gunStatus = LG_HANDS_BUSY; } - else if((!slope && (abs(coll->frontCeiling - coll->frontFloor) < 256)) && EnableCrawlFlex2click == true) + else if((!slope && (abs(coll->frontCeiling - coll->frontFloor) < 256)) && EnableVaultToCrouch2click) { item->animNumber = LA_VAULT_TO_CROUCH_2CLICK; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; @@ -6502,7 +6512,7 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) item->pos.yPos += coll->frontFloor + 768; Lara.gunStatus = LG_HANDS_BUSY; } - else if ((!slope && (abs(coll->frontCeiling - coll->frontFloor) < 256) && EnableCrawlFlex3click == true )) + else if ((!slope && (abs(coll->frontCeiling - coll->frontFloor) < 256) && EnableVaultToCrouch3click)) { item->animNumber = LA_VAULT_TO_CROUCH_3CLICK; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; @@ -6588,7 +6598,7 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) } return 1; } - else if (EnableMonkeyVault == true) + else if (EnableAutoJumpUpToMonkey) { if (Lara.canMonkeySwing) { @@ -6899,10 +6909,7 @@ int TestHangFeet(ITEM_INFO* item, short angle) if (Lara.climbStatus) return 0; -// EnableFeetHang = true; - - - if (!EnableFeetHang) + if (!EnableHangFeet) return 0; int x = item->pos.xPos; diff --git a/TR5Main/Game/lara.h b/TR5Main/Game/lara.h index 28eebe5b4..84489bcef 100644 --- a/TR5Main/Game/lara.h +++ b/TR5Main/Game/lara.h @@ -219,4 +219,6 @@ void lara_as_hang_feet_inRcorner(ITEM_INFO* item, COLL_INFO* coll); void lara_as_hang_feet_inLcorner(ITEM_INFO* item, COLL_INFO* coll); void lara_as_hang_feet_outRcorner(ITEM_INFO* item, COLL_INFO* coll); void lara_as_hang_feet_outLcorner(ITEM_INFO* item, COLL_INFO* coll); -void SetCornerAnimFeet(ITEM_INFO* item, COLL_INFO* coll, short rot, short flip); \ No newline at end of file +void SetCornerAnimFeet(ITEM_INFO* item, COLL_INFO* coll, short rot, short flip); + +bool TestLaraLean(ITEM_INFO* item, COLL_INFO* coll); \ No newline at end of file diff --git a/TR5Main/Game/lara_struct.h b/TR5Main/Game/lara_struct.h index c9a964114..49c74b84d 100644 --- a/TR5Main/Game/lara_struct.h +++ b/TR5Main/Game/lara_struct.h @@ -79,7 +79,7 @@ enum LARA_STATE LS_LADDER_STOP = 59, LS_LADDER_RIGHT = 60, LS_LADDER_DOWN = 61, - LS_TEST_1 = 62, + LS_TEST_1 = 62, // Used for auto monkey up jump. LS_TEST_2 = 63, LS_TEST_3 = 64, LS_WADE_FORWARD = 65, @@ -621,8 +621,7 @@ enum LARA_ANIM LA_ROPE_HANG_IDLE_UNUSED = 408, // Rope hang (looped) LA_ROPE_SWING_TO_REACH_UNUSED_3 = 409, // Rope swing > reach, 3rd unused opportunity LA_ROPE_SWING_TO_REACH_UNUSED_2 = 410, // Rope swing > reach, 2nd unused opportunity - // TODO: confirm dispatch. - LA_ROPE_SWING_TO_REACH_UNUSED_1 = 411, // Rope swing > reach, 1stunused opportunity + LA_ROPE_SWING_TO_REACH_UNUSED_1 = 411, // Rope swing > reach, 1st unused opportunity LA_DOUBLEDOOR_OPEN_PUSH = 412, // Push double doors LA_BUTTON_LARGE_PUSH = 413, // Push big button LA_JUMPSWITCH_PULL = 414, // Pull jumpswitch @@ -643,7 +642,7 @@ enum LARA_ANIM LA_TORCH_LIGHT_2 = 428, // Light torch with flame 2-3 clicks high LA_TORCH_LIGHT_3 = 429, // Light torch with flame 4-5 clicks high LA_TORCH_LIGHT_4 = 430, // Light torch with flame 6-7 clicks high - LA_TORCH_LIGHT_5 = 431, // Light torch with flame greater than 7 clicks + LA_TORCH_LIGHT_5 = 431, // Light torch with flame higher than 7 clicks LA_DETONATOR_USE = 432, // Use mine detonator LA_CORRECT_POSITION_FRONT = 433, // Adjust position forward LA_CORRECT_POSITION_LEFT = 434, // Adjust position left diff --git a/TR5Main/Game/laraclmb.cpp b/TR5Main/Game/laraclmb.cpp index df7c934dc..7356cf6d7 100644 --- a/TR5Main/Game/laraclmb.cpp +++ b/TR5Main/Game/laraclmb.cpp @@ -143,8 +143,7 @@ void lara_as_climbdown(ITEM_INFO* item, COLL_INFO* coll)//46BA4(<), 47008(<) (F) void lara_col_climbing(ITEM_INFO* item, COLL_INFO* coll)//469B0, 46E14 (F) { - if (!LaraCheckForLetGo(item, coll) - && item->animNumber == LA_LADDER_UP) + if (!LaraCheckForLetGo(item, coll) && item->animNumber == LA_LADDER_UP) { int frame = item->frameNumber - g_Level.Anims[LA_LADDER_UP].frameBase; int yShift; @@ -273,8 +272,7 @@ void lara_col_climbstnc(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) int shiftRight, shiftLeft; int ledgeRight, ledgeLeft; - if (LaraCheckForLetGo(item, coll) - || item->animNumber != LA_LADDER_IDLE) + if (LaraCheckForLetGo(item, coll) || item->animNumber != LA_LADDER_IDLE) return; if (!(TrInput & IN_FORWARD)) @@ -430,38 +428,38 @@ int LaraTestClimbPos(ITEM_INFO* item, int front, int right, int origin, int heig short angle = (unsigned short) (item->pos.yRot + ANGLE(45)) >> W2V_SHIFT; int x; int z; - int xfront = 0; - int zfront = 0; + int xFront = 0; + int zFront = 0; switch (angle) { case NORTH: x = item->pos.xPos + right; z = item->pos.zPos + front; - zfront = 256; + zFront = 256; break; case EAST: x = item->pos.xPos + front; z = item->pos.zPos - right; - xfront = 256; + xFront = 256; break; case SOUTH: x = item->pos.xPos - right; z = item->pos.zPos - front; - zfront = -256; + zFront = -256; break; case WEST: default: x = item->pos.xPos - front; z = item->pos.zPos + right; - xfront = -256; + xFront = -256; break; } - return LaraTestClimb(x, item->pos.yPos + origin, z, xfront, zfront, height, item->roomNumber, shift); + return LaraTestClimb(x, item->pos.yPos + origin, z, xFront, zFront, height, item->roomNumber, shift); } void LaraDoClimbLeftRight(ITEM_INFO* item, COLL_INFO* coll, int result, int shift)//46100, 46564 (F) From f981ba23e4caa0d4a9729651ccff9e1daf47fd5e Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Sat, 8 Aug 2020 20:31:48 +0200 Subject: [PATCH 06/22] Decompiled ID_ENEMY_JEEP --- TR5Main/Game/control.cpp | 7 + TR5Main/Game/control.h | 1 + TR5Main/Game/draw.cpp | 15 + TR5Main/Game/draw.h | 1 + TR5Main/Objects/TR4/Entity/tr4_baddy.cpp | 16 +- TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp | 402 ++++++++++++++++++ TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.h | 5 + TR5Main/Objects/TR4/tr4_objects.cpp | 24 ++ TR5Main/TR5Main.vcxproj | 2 + TR5Main/TR5Main.vcxproj.filters | 6 + 10 files changed, 464 insertions(+), 15 deletions(-) create mode 100644 TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp create mode 100644 TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.h diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index c41b93bbe..dd7d4d0f2 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -3267,3 +3267,10 @@ int IsRoomOutside(int x, int y, int z) return -2; } + +void GetFloorAndTestTriggers(int x, int y, int z, short roomNumber, int heavy, int heavyFlags) +{ + FLOOR_INFO* floor = GetFloor(x, y, z, &roomNumber); + GetFloorHeight(floor, x, y, z); + TestTriggers(TriggerIndex, heavy, heavyFlags); +} diff --git a/TR5Main/Game/control.h b/TR5Main/Game/control.h index f37729fe1..dfa3f7cfc 100644 --- a/TR5Main/Game/control.h +++ b/TR5Main/Game/control.h @@ -181,5 +181,6 @@ int GetWaterHeight(int x, int y, int z, short roomNumber); int is_object_in_room(short roomNumber, short objectNumber); void InterpolateAngle(short angle, short* rotation, short* outAngle, int shift); int IsRoomOutside(int x, int y, int z); +void GetFloorAndTestTriggers(int x, int y, int z, short roomNumber, int heavy, int heavyFlags); unsigned CALLBACK GameMain(void*); \ No newline at end of file diff --git a/TR5Main/Game/draw.cpp b/TR5Main/Game/draw.cpp index 21f103ec0..9491d0cf0 100644 --- a/TR5Main/Game/draw.cpp +++ b/TR5Main/Game/draw.cpp @@ -174,3 +174,18 @@ void GetLaraJointPosition(PHD_VECTOR* pos, int LM_enum) pos->y = p.y; pos->z = p.z; } + +void ClampRotation(PHD_3DPOS* pos, short angle, short rot) +{ + if (angle <= rot) + { + if (angle >= -rot) + pos->yRot += angle; + else + pos->yRot -= rot; + } + else + { + pos->yRot += rot; + } +} diff --git a/TR5Main/Game/draw.h b/TR5Main/Game/draw.h index ed25068e8..683cd5d85 100644 --- a/TR5Main/Game/draw.h +++ b/TR5Main/Game/draw.h @@ -20,3 +20,4 @@ bool TIME_Init(); bool TIME_Reset(); void DrawAnimatingItem(ITEM_INFO* item); void GetLaraJointPosition(PHD_VECTOR* pos, int LM_enum); +void ClampRotation(PHD_3DPOS* pos, short angle, short rot); \ No newline at end of file diff --git a/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp b/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp index bea818cf0..97d26ea73 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp @@ -9,6 +9,7 @@ #include "effect.h" #include "setup.h" #include "level.h" +#include enum BADDY_STATES { STATE_BADDY_STOP = 0, @@ -157,21 +158,6 @@ enum BADDY_SWAP_MESH_FLAGS { BITE_INFO baddyGun = { 0, -16, 200, 11 }; BITE_INFO baddySword = { 0, 0, 0, 15 }; -void ClampRotation(PHD_3DPOS *pos, short angle, short rot) -{ - if (angle <= rot) - { - if (angle >= -rot) - pos->yRot += angle; - else - pos->yRot -= rot; - } - else - { - pos->yRot += rot; - } -} - void InitialiseBaddy(short itemNum) { ITEM_INFO* item = &g_Level.Items[itemNum]; diff --git a/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp b/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp new file mode 100644 index 000000000..c8f228611 --- /dev/null +++ b/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp @@ -0,0 +1,402 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void EnemyJeepLaunchGrenade(ITEM_INFO* item) +{ + short grenadeItemNumber = CreateItem(); + + if (grenadeItemNumber != NO_ITEM) + { + ITEM_INFO* grenadeItem = &g_Level.Items[grenadeItemNumber]; + + grenadeItem->shade = -15856; + grenadeItem->objectNumber = ID_GRENADE; + grenadeItem->roomNumber = item->roomNumber; + + InitialiseItem(grenadeItemNumber); + + grenadeItem->pos.xRot = item->pos.xRot; + grenadeItem->pos.yRot = item->pos.yRot + -ANGLE(180); + grenadeItem->pos.zRot = 0; + + grenadeItem->pos.xPos = item->pos.xPos + (1024 * phd_sin(grenadeItem->pos.yRot) >> W2V_SHIFT); + grenadeItem->pos.yPos = item->pos.yPos - 768; + grenadeItem->pos.zPos = item->pos.xPos + (1024 * phd_cos(grenadeItem->pos.yRot) >> W2V_SHIFT); + + SmokeCountL = 32; + SmokeWeapon = 5; + + for (int i = 0; i < 5; i++) + { + TriggerGunSmoke(item->pos.xPos, item->pos.yPos, item->pos.zPos, 0, 0, 0, 1, 5, 32); + } + + if (GetRandomControl() & 3) + { + grenadeItem->itemFlags[0] = 1; + } + else + { + grenadeItem->itemFlags[0] = 2; + } + + grenadeItem->speed = 32; + grenadeItem->currentAnimState = grenadeItem->pos.xRot; + grenadeItem->fallspeed = -32 * phd_sin(grenadeItem->pos.xRot) >> W2V_SHIFT; + grenadeItem->goalAnimState = grenadeItem->pos.yRot; + grenadeItem->requiredAnimState = 0; + grenadeItem->hitPoints = 120; + + AddActiveItem(grenadeItemNumber); + } +} + +void InitialiseEnemyJeep(short itemNumber) +{ + ITEM_INFO* item = &g_Level.Items[itemNumber]; + + item->itemFlags[0] = -80; + + if (g_Level.NumItems > 0) + { + for (int i = 0; i < g_Level.NumItems; i++) + { + ITEM_INFO* other = &g_Level.Items[i]; + + if (other == item || other->triggerFlags != item->triggerFlags) + continue; + + item->itemFlags[1] = i; + other->itemFlags[0] = -80; + other->pos.yPos = item->pos.yPos - 1024; + } + } +} + +void EnemyJeepControl(short itemNumber) +{ + if (CreatureActive(itemNumber)) + { + ITEM_INFO* item = &g_Level.Items[itemNumber]; + CREATURE_INFO* creature = (CREATURE_INFO*)item->data; + + int x = item->pos.xPos; + int y = item->pos.yPos; + int z = item->pos.zPos; + + int dx = 682 * phd_sin(item->pos.yRot) >> W2V_SHIFT; + int dz = 682 * phd_cos(item->pos.yRot) >> W2V_SHIFT; + + short roomNumber = item->roomNumber; + FLOOR_INFO* floor = GetFloor(x - dz, y, z - dx, &roomNumber); + int height1 = GetFloorHeight(floor, x - dz, y, z - dx); + if (abs(item->pos.yPos - height1) > 768) + { + item->pos.yRot += ANGLE(2); + item->pos.xPos += (dz / 64); + item->pos.zPos += (dx / 64); + height1 = y; + } + + roomNumber = item->roomNumber; + floor = GetFloor(x + dz, y, z - dx, &roomNumber); + int height2 = GetFloorHeight(floor, x + dz, y, z - dx); + if (abs(item->pos.yPos - height2) > 768) + { + item->pos.yRot -= ANGLE(2); + item->pos.xPos -= (dz / 64); + item->pos.zPos += (dx / 64); + height2 = y; + } + + short zRot = phd_atan(1364, height2 - height1); + + roomNumber = item->roomNumber; + floor = GetFloor(x + dx, y, z + dz, &roomNumber); + int height3 = GetFloorHeight(floor, x + dx, y, z + dz); + if (abs(y - height3) > 768) + { + height3 = y; + } + + roomNumber = item->roomNumber; + floor = GetFloor(x - dx, y, z - dz, &roomNumber); + int height4 = GetFloorHeight(floor, x - dx, y, z - dz); + if (abs(y - height4) > 768) + { + height4 = y; + } + + short xRot = phd_atan(1364, height4 - height3); + + AI_INFO info; + CreatureAIInfo(item, &info); + + ITEM_INFO* target = &creature->aiTarget; + creature->enemy = target; + short angle; + int distance; + if (target == LaraItem) + { + angle = info.angle; + distance = info.distance; + } + else + { + dx = LaraItem->pos.xPos - item->pos.xPos; + dz = LaraItem->pos.zPos - item->pos.zPos; + angle = phd_atan(dz, dx) - item->pos.yRot; + if (dx > 32000 || dx < -32000 || dz > 32000 || dz < -32000) + distance = 0x7FFFFFFF; + else + distance = SQUARE(dx) + SQUARE(dz); + } + + PHD_VECTOR pos; + + switch (item->currentAnimState) + { + case 0: + case 2: + item->itemFlags[0] -= 128; + if (item->itemFlags[0] < 0) + item->itemFlags[0] = 0; + + item->meshBits = -98305; + + pos.x = 0; + pos.y = -144; + pos.z = -1024; + GetJointAbsPosition(item, &pos, 11); + TriggerDynamicLight(pos.x, pos.y, pos.z, 10, 64, 0, 0); + + if (item->requiredAnimState) + item->goalAnimState = item->requiredAnimState; + else if (info.distance > SQUARE(1024) || Lara.location >= item->itemFlags[3]) + item->goalAnimState = 1; + + break; + + case 1: + creature->maximumTurn = item->itemFlags[0] / 16; + item->itemFlags[0] += 37; + if (item->itemFlags[0] > 8704) + item->itemFlags[0] = 8704; + + item->meshBits = -147457; + + if (info.angle <= 256) + { + if (info.angle < -256) + { + item->goalAnimState = 3; + } + } + else + { + item->goalAnimState = 4; + } + + break; + + case 3: + case 4: + item->itemFlags[0] += 18; + if (item->itemFlags[0] > 8704) + item->itemFlags[0] = 8704; + item->goalAnimState = 1; + + break; + + case 5: + if (item->itemFlags[0] < 1184) + item->itemFlags[0] = 1184; + + break; + + default: + break; + } + + if (height3 <= item->floor + 512) + { + if (height4 > item->floor + 512 && item->currentAnimState != 5) + { + item->itemFlags[1] = 0; + item->animNumber = Objects[item->objectNumber].animIndex + 8; + item->frameNumber = g_Level.Anims[item->animNumber].frameBase; + item->currentAnimState = 5; + item->goalAnimState = 1; + } + } + else + { + creature->LOT.requiredBox |= 8; + if (item->itemFlags[1] > 0) + { + item->itemFlags[1] -= 8; + if (item->itemFlags[1]<0) + creature->LOT.requiredBox &= ~8; + item->pos.yPos += item->itemFlags[1] / 64; + } + else + { + item->itemFlags[1] = 2 * xRot; + creature->LOT.requiredBox |= 8u; + } + if (creature->LOT.requiredBox & 8) + { + creature->maximumTurn = 0; + item->goalAnimState = 1; + } + } + + if (info.distance < SQUARE(1536) || item->itemFlags[3] == -2) + creature->reachedGoal = true; + + if (creature->reachedGoal) + { + GetFloorAndTestTriggers(target->pos.xPos, target->pos.yPos, target->pos.zPos, target->roomNumber, 1, 0); + + if (Lara.location < item->itemFlags[3] && item->currentAnimState != 2 && item->goalAnimState != 2) + { + item->animNumber = Objects[item->objectNumber].animIndex + 1; + item->frameNumber = g_Level.Anims[item->animNumber].frameBase; + item->goalAnimState = 2; + item->currentAnimState = 2; + + if (target->flags & 4) + { + item->pos.xPos = target->pos.xPos; + item->pos.yPos = target->pos.yPos; + item->pos.zPos = target->pos.zPos; + item->pos.xRot = target->pos.xRot; + item->pos.yRot = target->pos.yRot; + item->pos.zRot = target->pos.zRot; + + if (item->roomNumber != target->roomNumber) + ItemNewRoom(itemNumber, target->roomNumber); + } + } + + if (distance > SQUARE(2048) && distance < SQUARE(10240) && !item->itemFlags[2] && (angle < -20480 || angle > 20480)) + { + EnemyJeepLaunchGrenade(item); + item->itemFlags[2] = 150; + } + + if (target->flags == 62) + { + item->status = ITEM_INVISIBLE; + RemoveActiveItem(itemNumber); + DisableBaddieAI(itemNumber); + } + + if (Lara.location >= item->itemFlags[3] || !(target->flags & 4)) + { + creature->reachedGoal = false; + item->itemFlags[3]++; + + creature->enemy = NULL; + AIOBJECT* aiObject = NULL; + + for (int i = 0; i < g_Level.AIObjects.size(); i++) + { + aiObject = &g_Level.AIObjects[i]; + + if (g_Level.AIObjects[i].triggerFlags == item->itemFlags[3] && g_Level.AIObjects[i].roomNumber != NO_ROOM) + { + aiObject = &g_Level.AIObjects[i]; + break; + } + } + + if (aiObject != NULL) + { + creature->enemy = target; + target->objectNumber = aiObject->objectNumber; + target->roomNumber = aiObject->roomNumber; + target->pos.xPos = aiObject->x; + target->pos.yPos = aiObject->y; + target->pos.zPos = aiObject->z; + target->pos.yRot = aiObject->yRot; + target->flags = aiObject->flags; + target->triggerFlags = aiObject->triggerFlags; + target->boxNumber = aiObject->boxNumber; + if (!(aiObject->flags & 0x20)) + { + target->pos.xPos += 256 * phd_sin(target->pos.yRot) >> W2V_SHIFT; + target->pos.zPos += 256 * phd_cos(target->pos.yRot) >> W2V_SHIFT; + } + } + } + } + + item->itemFlags[2]--; + if (item->itemFlags[2] < 0) + item->itemFlags[2] = 0; + + if (abs(xRot - item->pos.xRot) < 256) + item->pos.xRot = xRot; + else if (xRot < item->pos.xRot) + item->pos.xRot -= 256; + else + item->pos.xRot += 256; + + if (abs(zRot - item->pos.zRot) < 256) + item->pos.zRot = zRot; + else if (zRot < item->pos.zRot) + item->pos.zRot -= 256; + else + item->pos.zRot += 256; + + item->itemFlags[0] += -2 - xRot / 512; + if (item->itemFlags[0] < 0) + item->itemFlags[0] = 0; + + dx = item->itemFlags[0] * phd_sin(-2 - xRot / 512) >> W2V_SHIFT; + dz = item->itemFlags[0] * phd_cos(-2 - xRot / 512) >> W2V_SHIFT; + + item->pos.xPos += dx / 64; + item->pos.zPos += dz / 64; + + for (int i = 0; i < 4; i++) + { + creature->jointRotation[i] -= item->itemFlags[0]; + } + + if (!creature->reachedGoal) + ClampRotation(&item->pos, info.angle, item->itemFlags[0] / 16); + + creature->maximumTurn = 0; + AnimateItem(item); + + floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); + item->floor = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); + if (item->roomNumber != roomNumber) + ItemNewRoom(itemNumber, roomNumber); + + if (item->pos.yPos < item->floor) + item->gravityStatus = true; + else + { + item->fallspeed = 0; + item->pos.yPos = item->floor; + item->gravityStatus = false; + } + + SoundEffect(SFX_TR4_JEEP_MOVE, &item->pos, (item->itemFlags[0] << 10) + 16777220); + } +} \ No newline at end of file diff --git a/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.h b/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.h new file mode 100644 index 000000000..83e706334 --- /dev/null +++ b/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.h @@ -0,0 +1,5 @@ +#pragma once +#include + +void InitialiseEnemyJeep(short itemNumber); +void EnemyJeepControl(short itemNumber); diff --git a/TR5Main/Objects/TR4/tr4_objects.cpp b/TR5Main/Objects/TR4/tr4_objects.cpp index fe9a80b3b..804a69367 100644 --- a/TR5Main/Objects/TR4/tr4_objects.cpp +++ b/TR5Main/Objects/TR4/tr4_objects.cpp @@ -56,6 +56,7 @@ #include "objects.h" #include "setup.h" #include "level.h" +#include "tr4_enemy_jeep.h" static void StartBaddy(OBJECT_INFO* obj) { @@ -645,6 +646,29 @@ static void StartBaddy(OBJECT_INFO* obj) obj->saveAnim = true; obj->zoneType = ZONE_BASIC; } + + obj = &Objects[ID_ENEMY_JEEP]; + if (obj->loaded) + { + obj->initialise = InitialiseEnemyJeep; + obj->control = EnemyJeepControl; + obj->collision = CreatureCollision; + obj->saveFlags = true; + obj->savePosition = true; + obj->saveAnim = true; + obj->intelligent = true; + obj->saveHitpoints = true; + obj->pivotLength = 500; + obj->shadowSize = 128; + obj->radius = 512; + obj->hitPoints = 40; + obj->zoneType = ZONE_BASIC; + + g_Level.Bones[obj->boneIndex + 4 * 8] |= ROT_X; + g_Level.Bones[obj->boneIndex + 4 * 9] |= ROT_X; + g_Level.Bones[obj->boneIndex + 4 * 11] |= ROT_X; + g_Level.Bones[obj->boneIndex + 4 * 12] |= ROT_X; + } } static void StartObject(OBJECT_INFO* obj) diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 5a6689fa0..fd6d04bf6 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -147,6 +147,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -419,6 +420,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + Use diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index d7d6ae475..9b34cbadd 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -849,6 +849,9 @@ File di intestazione + + File di intestazione + @@ -1547,6 +1550,9 @@ File di origine + + File di origine + From 11b2e2cd61090de848df0d48c5dc1c365cb29aa6 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Sun, 9 Aug 2020 15:25:56 +0200 Subject: [PATCH 07/22] Refactored functions --- TR5Main/Game/control.cpp | 18 +- TR5Main/Game/draw.cpp | 2 +- TR5Main/Game/effect2.cpp | 2 +- TR5Main/Game/hair.cpp | 2 +- TR5Main/Game/health.cpp | 18 +- TR5Main/Game/inventory.cpp | 14 +- TR5Main/Game/laramisc.cpp | 2 +- TR5Main/Game/sphere.cpp | 4 +- TR5Main/Game/spotcam.cpp | 8 +- TR5Main/Game/text.cpp | 2 +- TR5Main/Renderer/Render11Helper.cpp | 75 ++--- TR5Main/Renderer/Renderer11.cpp | 9 +- TR5Main/Renderer/Renderer11.h | 181 +++++------- TR5Main/Renderer/Renderer11Compatibility.cpp | 6 +- TR5Main/Renderer/Renderer11Debug.cpp | 2 +- TR5Main/Renderer/Renderer11Draw.cpp | 296 +++++++------------ TR5Main/Renderer/Renderer11Draw2D.cpp | 29 +- TR5Main/Renderer/Renderer11DrawEffect.cpp | 84 +++--- TR5Main/Renderer/Renderer11Frame.cpp | 2 +- TR5Main/Renderer/Renderer11Init.cpp | 50 ++-- TR5Main/Renderer/Renderer11Lara.cpp | 8 +- TR5Main/Renderer/Renderer11PostProcess.cpp | 7 +- TR5Main/Renderer/Renderer11Settings.cpp | 28 +- TR5Main/Renderer/Renderer11String.cpp | 7 +- TR5Main/Renderer/Utils.cpp | 9 +- TR5Main/Specific/configuration.cpp | 6 +- TR5Main/Specific/level.cpp | 22 +- TR5Main/Specific/winmain.cpp | 4 +- 28 files changed, 375 insertions(+), 522 deletions(-) diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index dd7d4d0f2..d644214f3 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -215,7 +215,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode) // Does the player want to enter inventory? SetDebounce = false; - if (CurrentLevel != 0 && !g_Renderer.IsFading()) + if (CurrentLevel != 0 && !g_Renderer.isFading()) { if ((DbInput & IN_DESELECT || g_Inventory.GetEnterObject() != NO_ITEM) && !CutSeqTriggered && LaraItem->hitPoints > 0) { @@ -333,7 +333,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode) // Clear dynamic lights ClearDynamicLights(); ClearFires(); - g_Renderer.ClearDynamicLights(); + g_Renderer.clearDynamicLights(); GotLaraSpheres = false; @@ -438,7 +438,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode) InItemControlLoop = false; KillMoveItems(); - g_Renderer.UpdateLaraAnimations(true); + g_Renderer.updateLaraAnimations(true); // Update Lara's ponytails HairControl(0, 0, 0); @@ -539,7 +539,7 @@ unsigned CALLBACK GameMain(void *) TIME_Init(); // Do a fixed time title image - g_Renderer.DoTitleImage(); + g_Renderer.renderTitleImage(); // Execute the LUA gameflow and play the game g_GameFlow->DoGameflow(); @@ -702,18 +702,18 @@ GAME_STATUS DoLevel(int index, int ambient, bool loadFromSavegame) int nframes = 2; // First control phase - g_Renderer.ResetAnimations(); + g_Renderer.resetAnimations(); GAME_STATUS result = ControlPhase(nframes, 0); // Fade in screen - g_Renderer.FadeIn(); + g_Renderer.fadeIn(); // The game loop, finally! while (true) { nframes = DrawPhaseGame(); - g_Renderer.ResetAnimations(); + g_Renderer.resetAnimations(); result = ControlPhase(nframes, 0); if (result == GAME_STATUS_EXIT_TO_TITLE || @@ -2892,7 +2892,7 @@ void AnimateItem(ITEM_INFO *item) // Update matrices short itemNumber = item - g_Level.Items.data(); - g_Renderer.UpdateItemAnimations(itemNumber, true); + g_Renderer.updateItemAnimations(itemNumber, true); } void DoFlipMap(short group) @@ -2921,7 +2921,7 @@ void DoFlipMap(short group) AddRoomFlipItems(r); - g_Renderer.FlipRooms(i, r->flippedRoom); + g_Renderer.flipRooms(i, r->flippedRoom); } } diff --git a/TR5Main/Game/draw.cpp b/TR5Main/Game/draw.cpp index 9491d0cf0..6e78e0690 100644 --- a/TR5Main/Game/draw.cpp +++ b/TR5Main/Game/draw.cpp @@ -168,7 +168,7 @@ void GetLaraJointPosition(PHD_VECTOR* pos, int LM_enum) LM_enum = LM_HEAD; Vector3 p = Vector3(pos->x, pos->y, pos->z); - g_Renderer.GetLaraAbsBonePosition(&p, LM_enum); + g_Renderer.getLaraAbsBonePosition(&p, LM_enum); pos->x = p.x; pos->y = p.y; diff --git a/TR5Main/Game/effect2.cpp b/TR5Main/Game/effect2.cpp index d653875f2..550da70b5 100644 --- a/TR5Main/Game/effect2.cpp +++ b/TR5Main/Game/effect2.cpp @@ -1163,7 +1163,7 @@ void KillAllCurrentItems(short itemNumber) void TriggerDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b) { - g_Renderer.AddDynamicLight(x, y, z, falloff, r, g, b); + g_Renderer.addDynamicLight(x, y, z, falloff, r, g, b); } // Really needed? diff --git a/TR5Main/Game/hair.cpp b/TR5Main/Game/hair.cpp index 6047c2386..314176d1f 100644 --- a/TR5Main/Game/hair.cpp +++ b/TR5Main/Game/hair.cpp @@ -147,7 +147,7 @@ void HairControl(int cutscene, int ponytail, ANIM_FRAME* framePtr) } Matrix world; - g_Renderer.GetBoneMatrix(Lara.itemNumber, LM_HEAD, &world); + g_Renderer.getBoneMatrix(Lara.itemNumber, LM_HEAD, &world); if (ponytail) { diff --git a/TR5Main/Game/health.cpp b/TR5Main/Game/health.cpp index 0f0bf4e70..9791bbf27 100644 --- a/TR5Main/Game/health.cpp +++ b/TR5Main/Game/health.cpp @@ -36,7 +36,7 @@ void DrawHealthBarOverlay(int value) color2 = 0xA0A000; else color2 = 0xA00000; - g_Renderer.DrawBar(value, ::g_HealthBar); + g_Renderer.drawBar(value, ::g_HealthBar); } } @@ -44,7 +44,7 @@ void DrawHealthBar(float value) { if (CurrentLevel) { - g_Renderer.DrawBar(value, ::g_HealthBar); + g_Renderer.drawBar(value, ::g_HealthBar); } } @@ -137,7 +137,7 @@ void DrawAirBar(float value) { if (CurrentLevel) { - g_Renderer.DrawBar(value, ::g_AirBar); + g_Renderer.drawBar(value, ::g_AirBar); } } @@ -183,7 +183,7 @@ void DrawDashBar(int value) { if (CurrentLevel) { - g_Renderer.DrawBar(value, ::g_DashBar); + g_Renderer.drawBar(value, ::g_DashBar); } } @@ -194,12 +194,12 @@ int DrawAllPickups() if (PickupX > 0) { PickupX += -PickupX >> 5; - return g_Renderer.DrawPickup(Pickups[CurrentPickup].objectNumber); + g_Renderer.drawPickup(Pickups[CurrentPickup].objectNumber); } else { Pickups[CurrentPickup].life--; - return g_Renderer.DrawPickup(Pickups[CurrentPickup].objectNumber); + g_Renderer.drawPickup(Pickups[CurrentPickup].objectNumber); } } else if (Pickups[CurrentPickup].life == 0) @@ -209,13 +209,13 @@ int DrawAllPickups() if (PickupVel < 16) PickupVel++; PickupX += PickupVel >> 2; - return g_Renderer.DrawPickup(Pickups[CurrentPickup].objectNumber); + g_Renderer.drawPickup(Pickups[CurrentPickup].objectNumber); } else { Pickups[CurrentPickup].life = -1; PickupVel = 0; - return g_Renderer.DrawPickup(Pickups[CurrentPickup].objectNumber); + g_Renderer.drawPickup(Pickups[CurrentPickup].objectNumber); } } @@ -230,7 +230,7 @@ int DrawAllPickups() CurrentPickup = pickupIndex; if (i != MAX_COLLECTED_PICKUPS) - return g_Renderer.DrawPickup(Pickups[CurrentPickup].objectNumber); + g_Renderer.drawPickup(Pickups[CurrentPickup].objectNumber); CurrentPickup = 0; diff --git a/TR5Main/Game/inventory.cpp b/TR5Main/Game/inventory.cpp index 21ff02a2b..a6c0bee3a 100644 --- a/TR5Main/Game/inventory.cpp +++ b/TR5Main/Game/inventory.cpp @@ -726,7 +726,7 @@ int Inventory::DoInventory() passportResult == INV_RESULT_LOAD_GAME) { // Fade out - g_Renderer.FadeOut(); + g_Renderer.fadeOut(); for (int i = 0; i < FADE_FRAMES_COUNT; i++) { UpdateSceneAndDrawInventory(); @@ -1804,7 +1804,7 @@ bool Inventory::UpdateSceneAndDrawInventory() if (CurrentLevel == 0 && g_GameFlow->TitleType == TITLE_FLYBY) { - g_Renderer.DrawTitle(); + g_Renderer.renderTitle(); Camera.numberFrames = g_Renderer.SyncRenderer(); nframes = Camera.numberFrames; @@ -1812,7 +1812,7 @@ bool Inventory::UpdateSceneAndDrawInventory() } else { - g_Renderer.DrawInventory(); + g_Renderer.renderInventory(); g_Renderer.SyncRenderer(); } @@ -1831,7 +1831,7 @@ int Inventory::DoTitleInventory() m_activeRing = INV_RING_OPTIONS; // Fade in - g_Renderer.FadeIn(); + g_Renderer.fadeIn(); for (int i = 0; i < FADE_FRAMES_COUNT; i++) { UpdateSceneAndDrawInventory(); @@ -1931,7 +1931,7 @@ int Inventory::DoTitleInventory() CloseRing(INV_RING_OPTIONS, true); // Fade out - g_Renderer.FadeOut(); + g_Renderer.fadeOut(); for (int i = 0; i < FADE_FRAMES_COUNT; i++) { UpdateSceneAndDrawInventory(); @@ -2651,7 +2651,7 @@ void Inventory::DoGraphicsSettings() memcpy(&ring->Configuration, &g_Configuration, sizeof(GameConfiguration)); // Get current display mode - vector* adapters = g_Renderer.GetAdapters(); + vector* adapters = g_Renderer.getAdapters(); RendererVideoAdapter* adapter = &(*adapters)[ring->Configuration.Adapter]; ring->SelectedVideoMode = 0; for (int i = 0; i < adapter->DisplayModes.size(); i++) @@ -2782,7 +2782,7 @@ void Inventory::DoGraphicsSettings() SaveConfiguration(); // Reset screen and go back - g_Renderer.ChangeScreenResolution(ring->Configuration.Width, ring->Configuration.Height, + g_Renderer.changeScreenResolution(ring->Configuration.Width, ring->Configuration.Height, ring->Configuration.RefreshRate, ring->Configuration.Windowed); closeObject = true; diff --git a/TR5Main/Game/laramisc.cpp b/TR5Main/Game/laramisc.cpp index bd0e1dc36..5e6f33815 100644 --- a/TR5Main/Game/laramisc.cpp +++ b/TR5Main/Game/laramisc.cpp @@ -1047,7 +1047,7 @@ void AnimateLara(ITEM_INFO* item) } // Update matrices - g_Renderer.UpdateLaraAnimations(true); + g_Renderer.updateLaraAnimations(true); } void DelAlignLaraToRope(ITEM_INFO* item) // (F) (D) diff --git a/TR5Main/Game/sphere.cpp b/TR5Main/Game/sphere.cpp index 972e2af69..0687a9a53 100644 --- a/TR5Main/Game/sphere.cpp +++ b/TR5Main/Game/sphere.cpp @@ -20,7 +20,7 @@ int GetSpheres(ITEM_INFO* item, SPHERE* ptr, int worldSpace, Matrix local) BoundingSphere spheres[MAX_SPHERES]; short itemNumber = (item - g_Level.Items.data()); - int num = g_Renderer.GetSpheres(itemNumber, spheres, worldSpace, local); + int num = g_Renderer.getSpheres(itemNumber, spheres, worldSpace, local); for (int i = 0; i < MAX_SPHERES; i++) { @@ -168,7 +168,7 @@ void GetJointAbsPosition(ITEM_INFO* item, PHD_VECTOR* vec, int joint) // Use matrices done in the renderer and transform the input vector Vector3 p = Vector3(vec->x, vec->y, vec->z); - g_Renderer.GetItemAbsBonePosition(itemNumber, &p, joint); + g_Renderer.getItemAbsBonePosition(itemNumber, &p, joint); // Store the result vec->x = p.x; diff --git a/TR5Main/Game/spotcam.cpp b/TR5Main/Game/spotcam.cpp index 2b0b02d98..66a88978d 100644 --- a/TR5Main/Game/spotcam.cpp +++ b/TR5Main/Game/spotcam.cpp @@ -165,7 +165,7 @@ void InitialiseSpotCam(short Sequence) if ((s->flags & SCF_DISABLE_LARA_CONTROLS)) { DisableLaraControl = 1; - g_Renderer.EnableCinematicBars(true); + g_Renderer.enableCinematicBars(true); //SetFadeClip(16, 1); } @@ -659,7 +659,7 @@ void CalculateSpotCameras() { //SetFadeClip(16, 1); if (CurrentLevel) - g_Renderer.EnableCinematicBars(true); + g_Renderer.enableCinematicBars(true); DisableLaraControl = true; } @@ -760,7 +760,7 @@ void CalculateSpotCameras() } //SetFadeClip(0, 1); - g_Renderer.EnableCinematicBars(false); + g_Renderer.enableCinematicBars(false); UseSpotCam = 0; DisableLaraControl = 0; @@ -870,7 +870,7 @@ void CalculateSpotCameras() } else { - g_Renderer.EnableCinematicBars(false); + g_Renderer.enableCinematicBars(false); UseSpotCam = false; DisableLaraControl = false; Camera.speed = 1; diff --git a/TR5Main/Game/text.cpp b/TR5Main/Game/text.cpp index 97d5af0dd..6752a94f1 100644 --- a/TR5Main/Game/text.cpp +++ b/TR5Main/Game/text.cpp @@ -4,6 +4,6 @@ #include "Renderer11.h" namespace T5M::Renderer { void PrintString(int x, int y, int unk1, char* string, int unk2) { - g_Renderer.PrintString(x, y, string, D3DCOLOR_RGBA(0xFF, 0xFF, 0xFF, 255), 0); + g_Renderer.drawString(x, y, string, D3DCOLOR_RGBA(0xFF, 0xFF, 0xFF, 255), 0); } } diff --git a/TR5Main/Renderer/Render11Helper.cpp b/TR5Main/Renderer/Render11Helper.cpp index bd763ccfc..9210570ed 100644 --- a/TR5Main/Renderer/Render11Helper.cpp +++ b/TR5Main/Renderer/Render11Helper.cpp @@ -32,8 +32,8 @@ namespace T5M::Renderer z >= r->z && z <= r->z + r->ySize * 1024.0f); } - vector *Renderer11::GetAdapters() - { + std::vector* Renderer11::getAdapters() +{ return &m_adapters; } @@ -247,7 +247,7 @@ namespace T5M::Renderer return GetFrame_D2(&item, framePtr, rate); } - void Renderer11::UpdateItemAnimations(int itemNumber, bool force) + void Renderer11::updateItemAnimations(int itemNumber, bool force) { RendererItem *itemToDraw = &m_items[itemNumber]; itemToDraw->Id = itemNumber; @@ -327,7 +327,7 @@ namespace T5M::Renderer if (item->objectNumber == ID_LARA) continue; - UpdateItemAnimations(itemToDraw->Id, false); + updateItemAnimations(itemToDraw->Id, false); } } @@ -503,11 +503,11 @@ namespace T5M::Renderer return -1; } - bool Renderer11::IsFullsScreen() - { + bool Renderer11::isFullsScreen() +{ return (!Windowed); } - bool Renderer11::IsFading() + bool Renderer11::isFading() { return false; return (m_fadeStatus != FADEMODE_NONE); @@ -518,14 +518,12 @@ namespace T5M::Renderer gameCamera = RenderView(cam, roll, fov, 32, 102400, g_Configuration.Width, g_Configuration.Height); } - bool Renderer11::EnumerateVideoModes() - { + void Renderer11::EnumerateVideoModes() +{ HRESULT res; IDXGIFactory *dxgiFactory = NULL; - res = CreateDXGIFactory(__uuidof(IDXGIFactory), (void **)&dxgiFactory); - if (FAILED(res)) - return false; + Utils::throwIfFailed(CreateDXGIFactory(__uuidof(IDXGIFactory), (void **)&dxgiFactory)); IDXGIAdapter *dxgiAdapter = NULL; @@ -542,32 +540,22 @@ namespace T5M::Renderer adapter.Index = i; adapter.Name = videoCardDescription; - - printf("Adapter %d\n", i); - printf("\t Device Name: %s\n", videoCardDescription); - - IDXGIOutput *output = NULL; - res = dxgiAdapter->EnumOutputs(0, &output); - if (FAILED(res)) - return false; + logD("Adapter %d", i); + logD("Device Name : ", videoCardDescription); + ComPtr output; + if(FAILED(dxgiAdapter->EnumOutputs(0, output.GetAddressOf()))) + continue; UINT numModes = 0; - DXGI_MODE_DESC *displayModes = NULL; + std::vector displayModes; DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM; // Get the number of elements - res = output->GetDisplayModeList(format, 0, &numModes, NULL); - if (FAILED(res)) - return false; + Utils::throwIfFailed(output->GetDisplayModeList(format, 0, &numModes, NULL)); // Get the list - displayModes = new DXGI_MODE_DESC[numModes]; - res = output->GetDisplayModeList(format, 0, &numModes, displayModes); - if (FAILED(res)) - { - delete displayModes; - return false; - } + displayModes.resize(numModes); + Utils::throwIfFailed(output->GetDisplayModeList(format, 0, &numModes, displayModes.data())); for (int j = 0; j < numModes; j++) { @@ -598,17 +586,14 @@ namespace T5M::Renderer continue; adapter.DisplayModes.push_back(newMode); - printf("\t\t %d x %d %d Hz\n", newMode.Width, newMode.Height, newMode.RefreshRate); + logD("W: ", newMode.Width,"H: ", newMode.Height," ", newMode.RefreshRate, "Hz"); } m_adapters.push_back(adapter); - delete displayModes; } dxgiFactory->Release(); - - return true; } int SortLightsFunction(RendererLight *a, RendererLight *b) @@ -794,9 +779,9 @@ namespace T5M::Renderer return box.Intersects(sphere); } - void Renderer11::GetLaraBonePosition(Vector3 *pos, int bone) {} + void Renderer11::getLaraBonePosition(Vector3 *pos, int bone) {} - void Renderer11::FlipRooms(short roomNumber1, short roomNumber2) + void Renderer11::flipRooms(short roomNumber1, short roomNumber2) { RendererRoom temporary; @@ -812,14 +797,14 @@ namespace T5M::Renderer return m_meshes[meshIndex]; } - void Renderer11::GetLaraAbsBonePosition(Vector3 *pos, int joint) + void Renderer11::getLaraAbsBonePosition(Vector3 *pos, int joint) { Matrix world = m_moveableObjects[ID_LARA]->AnimationTransforms[joint]; world = world * m_LaraWorldMatrix; *pos = Vector3::Transform(*pos, world); } - void Renderer11::GetItemAbsBonePosition(int itemNumber, Vector3 *pos, int joint) + void Renderer11::getItemAbsBonePosition(int itemNumber, Vector3 *pos, int joint) { RendererItem *rendererItem = &m_items[itemNumber]; rendererItem->Id = itemNumber; @@ -832,16 +817,16 @@ namespace T5M::Renderer if (!rendererItem->DoneAnimations) { if (itemNumber == Lara.itemNumber) - UpdateLaraAnimations(false); + updateLaraAnimations(false); else - UpdateItemAnimations(itemNumber, false); + updateItemAnimations(itemNumber, false); } Matrix world = rendererItem->AnimationTransforms[joint] * rendererItem->World; *pos = Vector3::Transform(*pos, world); } - int Renderer11::GetSpheres(short itemNumber, BoundingSphere *spheres, char worldSpace, Matrix local) + int Renderer11::getSpheres(short itemNumber, BoundingSphere *spheres, char worldSpace, Matrix local) { RendererItem *rendererItem = &m_items[itemNumber]; rendererItem->Id = itemNumber; @@ -854,9 +839,9 @@ namespace T5M::Renderer if (!rendererItem->DoneAnimations) { if (itemNumber == Lara.itemNumber) - UpdateLaraAnimations(false); + updateLaraAnimations(false); else - UpdateItemAnimations(itemNumber, false); + updateItemAnimations(itemNumber, false); } int x, y, z; @@ -898,7 +883,7 @@ namespace T5M::Renderer return moveable.ObjectMeshes.size(); } - void Renderer11::GetBoneMatrix(short itemNumber, int joint, Matrix *outMatrix) + void Renderer11::getBoneMatrix(short itemNumber, int joint, Matrix *outMatrix) { RendererObject &obj = *m_moveableObjects[ID_LARA]; *outMatrix = obj.AnimationTransforms[joint] * m_LaraWorldMatrix; diff --git a/TR5Main/Renderer/Renderer11.cpp b/TR5Main/Renderer/Renderer11.cpp index b4d283349..88fb4f45c 100644 --- a/TR5Main/Renderer/Renderer11.cpp +++ b/TR5Main/Renderer/Renderer11.cpp @@ -33,7 +33,7 @@ namespace T5M::Renderer { } Renderer11::~Renderer11() { - FreeRendererData(); + freeRendererData(); DX11_RELEASE(m_backBufferRTV); DX11_RELEASE(m_backBufferTexture); @@ -69,7 +69,8 @@ namespace T5M::Renderer { DX11_RELEASE(m_device); } - void Renderer11::FreeRendererData() { + void Renderer11::freeRendererData() +{ m_meshPointersToMesh.clear(); m_moveableObjects.clear(); m_staticObjects.clear(); @@ -110,7 +111,7 @@ namespace T5M::Renderer { return nf; } - void Renderer11::UpdateProgress(float value) { + void Renderer11::updateProgress(float value) { m_progress = value; } @@ -119,7 +120,7 @@ namespace T5M::Renderer { void Renderer11::renderToCubemap(const RenderTargetCube& dest,const Vector3& pos,int roomNumer) { for (int i = 0; i < 6; i++) { RenderView renderView = RenderView(pos,RenderTargetCube::forwardVectors[i],RenderTargetCube::upVectors[i],dest.resolution,dest.resolution,Camera.pos.roomNumber,10,20480, 90* RADIAN); - drawSimpleScene(dest.RenderTargetView[i].Get(), dest.DepthStencilView[i].Get(), renderView); + renderSimpleScene(dest.RenderTargetView[i].Get(), dest.DepthStencilView[i].Get(), renderView); m_context->ClearState(); } } diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index cae653136..6e8824eda 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -534,7 +534,7 @@ namespace T5M::Renderer int m_pickupRotation; // Private functions - bool drawAllStrings(); + void drawAllStrings(); int getAnimatedTextureInfo(short textureId); void initialiseHairRemaps(); RendererMesh* getRendererMeshFromTrMesh(RendererObject* obj, MESH* meshPtr, short boneIndex, int isJoints, int isHairs); @@ -559,19 +559,18 @@ namespace T5M::Renderer int getFrame(short animation, short frame, ANIM_FRAME** framePtr, int* rate); bool drawAmbientCubeMap(short roomNumber); bool sphereBoxIntersection(DirectX::SimpleMath::Vector3 boxMin, DirectX::SimpleMath::Vector3 boxMax, DirectX::SimpleMath::Vector3 sphereCentre, float sphereRadius); - bool drawHorizonAndSky(ID3D11DepthStencilView* depthTarget); - bool drawRooms(bool transparent, bool animated, RenderView& view); - bool drawItems(bool transparent, bool animated,RenderView& view); - bool drawAnimatingItem(RendererItem* item, bool transparent, bool animated); - bool drawBaddieGunflashes(); - bool drawScaledSpikes(RendererItem* item, bool transparent, bool animated); - bool drawStatics(bool transparent, RenderView& view); - bool drawWaterfalls(); - bool drawShadowMap(RenderView& view); - bool drawWraithExtra(RendererItem* item, bool transparent, bool animated); - bool drawShadowMap(); - bool drawObjectOn2DPosition(short x, short y, short objectNum, short rotX, short rotY, short rotZ); - bool drawLara(bool transparent, bool shadowMap); + void drawHorizonAndSky(ID3D11DepthStencilView* depthTarget); + void drawRooms(bool transparent, bool animated, RenderView& view); + void drawItems(bool transparent, bool animated,RenderView& view); + void drawAnimatingItem(RendererItem* item, bool transparent, bool animated); + void drawBaddieGunflashes(); + void drawScaledSpikes(RendererItem* item, bool transparent, bool animated); + void drawStatics(bool transparent, RenderView& view); + void drawWaterfalls(); + void renderShadowMap(RenderView& view); + void drawWraithExtra(RendererItem* item, bool transparent, bool animated); + void drawObjectOn2DPosition(short x, short y, short objectNum, short rotX, short rotY, short rotZ); + void drawLara(bool transparent, bool shadowMap); void printDebugMessage(LPCSTR message, ...); void drawFires(); void drawSparks(); @@ -580,41 +579,40 @@ namespace T5M::Renderer void drawBlood(); void drawDrips(); void drawBubbles(); - bool drawEffects(bool transparent); - bool drawEffect(RendererEffect* effect, bool transparent); + void drawEffects(bool transparent); + void drawEffect(RendererEffect* effect, bool transparent); void drawSplahes(); - bool drawSprites(); - bool drawLines3D(); - bool drawLines2D(); - bool drawOverlays(); - bool drawRopes(); - bool drawBats(); - bool drawRats(); - bool drawLittleBeetles(); - bool drawSpiders(); + void drawSprites(); + void drawLines3D(); + void drawLines2D(); + void drawOverlays(); + void drawRopes(); + void drawBats(); + void drawRats(); + void drawLittleBeetles(); + void drawSpiders(); bool drawGunFlashes(); - bool drawGunShells(); - int drawInventoryScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, ID3D11ShaderResourceView* background); - bool drawDebris(bool transparent); - int drawFinalPass(); - bool drawFullScreenImage(ID3D11ShaderResourceView* texture, float fade, ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget); + void drawGunShells(); + void renderInventoryScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, ID3D11ShaderResourceView* background); + void drawDebris(bool transparent); + void drawFullScreenImage(ID3D11ShaderResourceView* texture, float fade, ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget); void updateAnimatedTextures(); void createBillboardMatrix(DirectX::SimpleMath::Matrix* out, DirectX::SimpleMath::Vector3* particlePos, DirectX::SimpleMath::Vector3* cameraPos, float rotation); void drawShockwaves(); void drawRipples(); void drawUnderwaterDust(); - bool doRain(); - bool doSnow(); - bool drawFullScreenQuad(ID3D11ShaderResourceView* texture, DirectX::SimpleMath::Vector3 color, bool cinematicBars); + void doRain(); + void doSnow(); + void drawFullScreenQuad(ID3D11ShaderResourceView* texture, DirectX::SimpleMath::Vector3 color, bool cinematicBars); bool isRoomUnderwater(short roomNumber); bool isInRoom(int x, int y, int z, short roomNumber); - bool drawColoredQuad(int x, int y, int w, int h, DirectX::SimpleMath::Vector4 color); - bool initialiseScreen(int w, int h, int refreshRate, bool windowed, HWND handle, bool reset); - bool initialiseBars(); - bool drawSmokeParticles(); - bool drawSparkParticles(); - bool drawDripParticles(); - bool drawExplosionParticles(); + void drawColoredQuad(int x, int y, int w, int h, DirectX::SimpleMath::Vector4 color); + void initialiseScreen(int w, int h, int refreshRate, bool windowed, HWND handle, bool reset); + void initialiseBars(); + void drawSmokeParticles(); + void drawSparkParticles(); + void drawDripParticles(); + void drawExplosionParticles(); void renderToCubemap(const RenderTargetCube& dest,const Vector3& pos,int roomNumber); void drawLaraHolsters(bool transparent); public: @@ -635,75 +633,56 @@ namespace T5M::Renderer Renderer11(); ~Renderer11(); - bool Create(); - bool EnumerateVideoModes(); - bool Initialise(int w, int h, int refreshRate, bool windowed, HWND handle); - int Draw(); + void Create(); + void EnumerateVideoModes(); + void Initialise(int w, int h, int refreshRate, bool windowed, HWND handle); + void Draw(); bool PrepareDataForTheRenderer(); void UpdateCameraMatrices(CAMERA_INFO* cam, float roll, float fov); - bool drawSimpleScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view); - int DumpGameScene(); - int DrawInventory(); - int DrawTitle(); - bool drawScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view); - int DrawPickup(short objectNum); + void renderSimpleScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view); + void DumpGameScene(); + void renderInventory(); + void renderTitle(); + void renderScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view); + void drawPickup(short objectNum); int SyncRenderer(); - bool PrintString(int x, int y, char* string, D3DCOLOR color, int flags); - void ClearDynamicLights(); - void AddDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b); - void FreeRendererData(); - void EnableCinematicBars(bool value); - void FadeIn(); - void FadeOut(); - void DrawLoadingScreen(std::wstring& fileName); - void UpdateProgress(float value); - bool IsFading(); - void GetLaraBonePosition(DirectX::SimpleMath::Vector3* pos, int bone); - bool ToggleFullScreen(); - bool IsFullsScreen(); - std::vector* GetAdapters(); - bool DoTitleImage(); - void AddLine2D(int x1, int y1, int x2, int y2, byte r, byte g, byte b, byte a); - void AddSpriteBillboard(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos,DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode); - void AddSpriteBillboardConstrained(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, DirectX::SimpleMath::Vector3 constrainAxis); - void AddSpriteBillboardConstrainedLookAt(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, DirectX::SimpleMath::Vector3 lookAtAxis); - void AddSprite3D(RendererSprite* sprite, DirectX::SimpleMath::Vector3 vtx1, DirectX::SimpleMath::Vector3 vtx2, DirectX::SimpleMath::Vector3 vtx3, DirectX::SimpleMath::Vector3 vtx4, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode); - void AddLine3D(DirectX::SimpleMath::Vector3 start, DirectX::SimpleMath::Vector3 end, DirectX::SimpleMath::Vector4 color); - bool ChangeScreenResolution(int width, int height, int frequency, bool windowed); - bool DrawBar(float percent, const RendererHUDBar* const bar); - void FlipRooms(short roomNumber1, short roomNumber2); - void ResetAnimations(); - void UpdateLaraAnimations(bool force); - void UpdateItemAnimations(int itemNumber, bool force); - void GetLaraAbsBonePosition(DirectX::SimpleMath::Vector3* pos, int joint); - void GetItemAbsBonePosition(int itemNumber, DirectX::SimpleMath::Vector3* pos, int joint); - int GetSpheres(short itemNumber, BoundingSphere* ptr, char worldSpace, DirectX::SimpleMath::Matrix local); - void GetBoneMatrix(short itemNumber, int joint, DirectX::SimpleMath::Matrix* outMatrix); + void drawString(int x, int y, char* string, D3DCOLOR color, int flags); + void clearDynamicLights(); + void addDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b); + void freeRendererData(); + void enableCinematicBars(bool value); + void fadeIn(); + void fadeOut(); + void renderLoadingScreen(std::wstring& fileName); + void updateProgress(float value); + bool isFading(); + void getLaraBonePosition(DirectX::SimpleMath::Vector3* pos, int bone); + void toggleFullScreen(); + bool isFullsScreen(); + std::vector* getAdapters(); + void renderTitleImage(); + void addLine2D(int x1, int y1, int x2, int y2, byte r, byte g, byte b, byte a); + void addSpriteBillboard(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos,DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode); + void addSpriteBillboardConstrained(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, DirectX::SimpleMath::Vector3 constrainAxis); + void addSpriteBillboardConstrainedLookAt(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, DirectX::SimpleMath::Vector3 lookAtAxis); + void addSprite3D(RendererSprite* sprite, DirectX::SimpleMath::Vector3 vtx1, DirectX::SimpleMath::Vector3 vtx2, DirectX::SimpleMath::Vector3 vtx3, DirectX::SimpleMath::Vector3 vtx4, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode); + void addLine3D(DirectX::SimpleMath::Vector3 start, DirectX::SimpleMath::Vector3 end, DirectX::SimpleMath::Vector4 color); + void changeScreenResolution(int width, int height, int frequency, bool windowed); + void drawBar(float percent, const RendererHUDBar* const bar); + void flipRooms(short roomNumber1, short roomNumber2); + void resetAnimations(); + void updateLaraAnimations(bool force); + void updateItemAnimations(int itemNumber, bool force); + void getLaraAbsBonePosition(DirectX::SimpleMath::Vector3* pos, int joint); + void getItemAbsBonePosition(int itemNumber, DirectX::SimpleMath::Vector3* pos, int joint); + int getSpheres(short itemNumber, BoundingSphere* ptr, char worldSpace, DirectX::SimpleMath::Matrix local); + void getBoneMatrix(short itemNumber, int joint, DirectX::SimpleMath::Matrix* outMatrix); RendererMesh* getMesh(int meshIndex); private: - Texture2D CreateDefaultNormalTexture(); + Texture2D createDefaultNormalTexture(); void drawFootprints(); - template - bool updateConstantBuffer(ID3D11Buffer* buffer, CBuff& data) { - HRESULT res; - D3D11_MAPPED_SUBRESOURCE mappedResource; - - // Lock the constant buffer so it can be written to. - res = m_context->Map(buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(res)) - return false; - - // Get a pointer to the data in the constant buffer. - void* dataPtr = (mappedResource.pData); - memcpy(dataPtr, &data, sizeof(CBuff)); - // Unlock the constant buffer. - m_context->Unmap(buffer, 0); - - return true; - } - template ConstantBuffer createConstantBuffer() { return ConstantBuffer(m_device); diff --git a/TR5Main/Renderer/Renderer11Compatibility.cpp b/TR5Main/Renderer/Renderer11Compatibility.cpp index e81a73d2c..11863d8c7 100644 --- a/TR5Main/Renderer/Renderer11Compatibility.cpp +++ b/TR5Main/Renderer/Renderer11Compatibility.cpp @@ -112,7 +112,7 @@ namespace T5M::Renderer TEXTURE *texture = &g_Level.RoomTextures[i]; Texture2D normal; if (texture->normalMapData.size() < 1) { - normal = CreateDefaultNormalTexture(); + normal = createDefaultNormalTexture(); } else { normal = Texture2D(m_device, texture->normalMapData.data(), texture->normalMapData.size()); } @@ -125,7 +125,7 @@ namespace T5M::Renderer TEXTURE *texture = &g_Level.MoveablesTextures[i]; Texture2D normal; if (texture->normalMapData.size() < 1) { - normal = CreateDefaultNormalTexture(); + normal = createDefaultNormalTexture(); } else { normal = Texture2D(m_device, texture->normalMapData.data(), texture->normalMapData.size()); } @@ -138,7 +138,7 @@ namespace T5M::Renderer TEXTURE *texture = &g_Level.StaticsTextures[i]; Texture2D normal; if (texture->normalMapData.size() < 1) { - normal = CreateDefaultNormalTexture(); + normal = createDefaultNormalTexture(); } else { normal = Texture2D(m_device, texture->normalMapData.data(), texture->normalMapData.size()); } diff --git a/TR5Main/Renderer/Renderer11Debug.cpp b/TR5Main/Renderer/Renderer11Debug.cpp index 2d52b5df4..a20f7ae02 100644 --- a/TR5Main/Renderer/Renderer11Debug.cpp +++ b/TR5Main/Renderer/Renderer11Debug.cpp @@ -14,7 +14,7 @@ namespace T5M::Renderer { _vsprintf_l(buffer, message, NULL, args); va_end(args); - PrintString(10, m_currentY, buffer, 0xFFFFFFFF, PRINTSTRING_OUTLINE); + drawString(10, m_currentY, buffer, 0xFFFFFFFF, PRINTSTRING_OUTLINE); m_currentY += 20; } diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index 39d94e690..98e827e18 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -33,14 +33,13 @@ namespace T5M::Renderer using namespace T5M::Renderer; using namespace std::chrono; - int Renderer11::DrawPickup(short objectNum) + void Renderer11::drawPickup(short objectNum) { drawObjectOn2DPosition(700 + PickupX, 450, objectNum, 0, m_pickupRotation, 0); // TODO: + PickupY m_pickupRotation += 45 * 360 / 30; - return 0; } - bool Renderer11::drawObjectOn2DPosition(short x, short y, short objectNum, short rotX, short rotY, short rotZ) + void Renderer11::drawObjectOn2DPosition(short x, short y, short objectNum, short rotX, short rotY, short rotZ) { Matrix translation; Matrix rotation; @@ -137,10 +136,9 @@ namespace T5M::Renderer } } - return true; } - bool Renderer11::drawShadowMap(RenderView &renderView) + void Renderer11::renderShadowMap(RenderView& renderView) { m_shadowLight = NULL; RendererLight *brightestLight = NULL; @@ -219,7 +217,7 @@ namespace T5M::Renderer m_shadowLight = brightestLight; if (m_shadowLight == NULL) - return true; + return; // Reset GPU state m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); @@ -238,7 +236,7 @@ namespace T5M::Renderer Vector3 lightPos = Vector3(m_shadowLight->Position.x, m_shadowLight->Position.y, m_shadowLight->Position.z); Vector3 itemPos = Vector3(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos); if (lightPos == itemPos) - return true; + return; UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -380,11 +378,10 @@ namespace T5M::Renderer } } - return true; } - bool Renderer11::DoTitleImage() - { + void Renderer11::renderTitleImage() +{ wchar_t introFileChars[255]; std::mbstowcs(introFileChars, g_GameFlow->Intro, 255); @@ -415,11 +412,10 @@ namespace T5M::Renderer currentFade -= FADE_FACTOR; m_swapChain->Present(0, 0); } - return true; } - bool Renderer11::drawGunShells() - { + void Renderer11::drawGunShells() +{ RendererRoom &const room = m_rooms[LaraItem->roomNumber]; RendererItem *item = &m_items[Lara.itemNumber]; @@ -468,10 +464,9 @@ namespace T5M::Renderer } } - return true; } - int Renderer11::drawInventoryScene(ID3D11RenderTargetView *target, ID3D11DepthStencilView *depthTarget, ID3D11ShaderResourceView *background) + void Renderer11::renderInventoryScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, ID3D11ShaderResourceView* background) { char stringBuffer[255]; @@ -558,7 +553,7 @@ namespace T5M::Renderer // Yellow title if (ring->focusState == INV_FOCUS_STATE_NONE && g_Inventory.GetType() != INV_TYPE_TITLE) - PrintString(400, 20, g_GameFlow->GetString(activeRing->titleStringIndex), PRINTSTRING_COLOR_YELLOW, PRINTSTRING_CENTER); + drawString(400, 20, g_GameFlow->GetString(activeRing->titleStringIndex), PRINTSTRING_COLOR_YELLOW, PRINTSTRING_CENTER); for (int i = 0; i < numObjects; i++) { @@ -680,17 +675,17 @@ namespace T5M::Renderer for (int n = 0; n < MAX_SAVEGAMES; n++) { if (!g_NewSavegameInfos[n].Present) - PrintString(400, y, g_GameFlow->GetString(45), D3DCOLOR_ARGB(255, 255, 255, 255), + drawString(400, y, g_GameFlow->GetString(45), D3DCOLOR_ARGB(255, 255, 255, 255), PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == n ? PRINTSTRING_BLINK : 0)); else { sprintf(stringBuffer, "%05d", g_NewSavegameInfos[n].Count); - PrintString(200, y, stringBuffer, D3DCOLOR_ARGB(255, 255, 255, 255), PRINTSTRING_OUTLINE | (ring->selectedIndex == n ? PRINTSTRING_BLINK | PRINTSTRING_DONT_UPDATE_BLINK : 0)); + drawString(200, y, stringBuffer, D3DCOLOR_ARGB(255, 255, 255, 255), PRINTSTRING_OUTLINE | (ring->selectedIndex == n ? PRINTSTRING_BLINK | PRINTSTRING_DONT_UPDATE_BLINK : 0)); - PrintString(250, y, (char *)g_NewSavegameInfos[n].LevelName.c_str(), D3DCOLOR_ARGB(255, 255, 255, 255), PRINTSTRING_OUTLINE | (ring->selectedIndex == n ? PRINTSTRING_BLINK | PRINTSTRING_DONT_UPDATE_BLINK : 0)); + drawString(250, y, (char *)g_NewSavegameInfos[n].LevelName.c_str(), D3DCOLOR_ARGB(255, 255, 255, 255), PRINTSTRING_OUTLINE | (ring->selectedIndex == n ? PRINTSTRING_BLINK | PRINTSTRING_DONT_UPDATE_BLINK : 0)); sprintf(stringBuffer, g_GameFlow->GetString(44), g_NewSavegameInfos[n].Days, g_NewSavegameInfos[n].Hours, g_NewSavegameInfos[n].Minutes, g_NewSavegameInfos[n].Seconds); - PrintString(475, y, stringBuffer, D3DCOLOR_ARGB(255, 255, 255, 255), + drawString(475, y, stringBuffer, D3DCOLOR_ARGB(255, 255, 255, 255), PRINTSTRING_OUTLINE | (ring->selectedIndex == n ? PRINTSTRING_BLINK : 0)); } @@ -725,7 +720,7 @@ namespace T5M::Renderer for (int n = 1; n < g_GameFlow->GetNumLevels(); n++) { GameScriptLevel *levelScript = g_GameFlow->GetLevel(n); - PrintString(400, lastY, g_GameFlow->GetString(levelScript->NameStringIndex), D3DCOLOR_ARGB(255, 255, 255, 255), + drawString(400, lastY, g_GameFlow->GetString(levelScript->NameStringIndex), D3DCOLOR_ARGB(255, 255, 255, 255), PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == n - 1 ? PRINTSTRING_BLINK : 0)); lastY += 24; @@ -754,7 +749,7 @@ namespace T5M::Renderer break; } - PrintString(400, 550, string, PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE); + drawString(400, 550, string, PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE); } /* **************** GRAPHICS SETTINGS ************* */ else if (inventoryItem == INV_OBJECT_SUNGLASSES && ring->focusState == INV_FOCUS_STATE_FOCUSED) @@ -764,13 +759,13 @@ namespace T5M::Renderer int y = 200; - PrintString(400, y, g_GameFlow->GetString(STRING_DISPLAY), + drawString(400, y, g_GameFlow->GetString(STRING_DISPLAY), PRINTSTRING_COLOR_YELLOW, PRINTSTRING_OUTLINE | PRINTSTRING_CENTER); y += 25; // Screen resolution - PrintString(200, y, g_GameFlow->GetString(STRING_SCREEN_RESOLUTION), + drawString(200, y, g_GameFlow->GetString(STRING_SCREEN_RESOLUTION), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_DONT_UPDATE_BLINK | PRINTSTRING_OUTLINE | (ring->selectedIndex == 0 ? PRINTSTRING_BLINK : 0)); @@ -779,59 +774,59 @@ namespace T5M::Renderer ZeroMemory(buffer, 255); sprintf(buffer, "%d x %d (%d Hz)", mode->Width, mode->Height, mode->RefreshRate); - PrintString(400, y, buffer, PRINTSTRING_COLOR_WHITE, + drawString(400, y, buffer, PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 0 ? PRINTSTRING_BLINK : 0)); y += 25; // Windowed mode - PrintString(200, y, g_GameFlow->GetString(STRING_WINDOWED), + drawString(200, y, g_GameFlow->GetString(STRING_WINDOWED), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_DONT_UPDATE_BLINK | PRINTSTRING_OUTLINE | (ring->selectedIndex == 1 ? PRINTSTRING_BLINK : 0)); - PrintString(400, y, g_GameFlow->GetString(ring->Configuration.Windowed ? STRING_ENABLED : STRING_DISABLED), + drawString(400, y, g_GameFlow->GetString(ring->Configuration.Windowed ? STRING_ENABLED : STRING_DISABLED), PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 1 ? PRINTSTRING_BLINK : 0)); y += 25; // Enable dynamic shadows - PrintString(200, y, g_GameFlow->GetString(STRING_SHADOWS), + drawString(200, y, g_GameFlow->GetString(STRING_SHADOWS), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_DONT_UPDATE_BLINK | PRINTSTRING_OUTLINE | (ring->selectedIndex == 2 ? PRINTSTRING_BLINK : 0)); - PrintString(400, y, g_GameFlow->GetString(ring->Configuration.EnableShadows ? STRING_ENABLED : STRING_DISABLED), + drawString(400, y, g_GameFlow->GetString(ring->Configuration.EnableShadows ? STRING_ENABLED : STRING_DISABLED), PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 2 ? PRINTSTRING_BLINK : 0)); y += 25; // Enable caustics - PrintString(200, y, g_GameFlow->GetString(STRING_CAUSTICS), + drawString(200, y, g_GameFlow->GetString(STRING_CAUSTICS), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_DONT_UPDATE_BLINK | PRINTSTRING_OUTLINE | (ring->selectedIndex == 3 ? PRINTSTRING_BLINK : 0)); - PrintString(400, y, g_GameFlow->GetString(ring->Configuration.EnableCaustics ? STRING_ENABLED : STRING_DISABLED), + drawString(400, y, g_GameFlow->GetString(ring->Configuration.EnableCaustics ? STRING_ENABLED : STRING_DISABLED), PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 3 ? PRINTSTRING_BLINK : 0)); y += 25; // Enable volumetric fog - PrintString(200, y, g_GameFlow->GetString(STRING_VOLUMETRIC_FOG), + drawString(200, y, g_GameFlow->GetString(STRING_VOLUMETRIC_FOG), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_DONT_UPDATE_BLINK | PRINTSTRING_OUTLINE | (ring->selectedIndex == 4 ? PRINTSTRING_BLINK : 0)); - PrintString(400, y, g_GameFlow->GetString(ring->Configuration.EnableVolumetricFog ? STRING_ENABLED : STRING_DISABLED), + drawString(400, y, g_GameFlow->GetString(ring->Configuration.EnableVolumetricFog ? STRING_ENABLED : STRING_DISABLED), PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 4 ? PRINTSTRING_BLINK : 0)); y += 25; // Apply and cancel - PrintString(400, y, g_GameFlow->GetString(STRING_APPLY), + drawString(400, y, g_GameFlow->GetString(STRING_APPLY), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == 5 ? PRINTSTRING_BLINK : 0)); y += 25; - PrintString(400, y, g_GameFlow->GetString(STRING_CANCEL), + drawString(400, y, g_GameFlow->GetString(STRING_CANCEL), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == 6 ? PRINTSTRING_BLINK : 0)); @@ -854,56 +849,56 @@ namespace T5M::Renderer y = 200; - PrintString(400, y, g_GameFlow->GetString(STRING_SOUND), + drawString(400, y, g_GameFlow->GetString(STRING_SOUND), PRINTSTRING_COLOR_YELLOW, PRINTSTRING_OUTLINE | PRINTSTRING_CENTER); y += 25; // Enable sound - PrintString(200, y, g_GameFlow->GetString(STRING_ENABLE_SOUND), + drawString(200, y, g_GameFlow->GetString(STRING_ENABLE_SOUND), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_DONT_UPDATE_BLINK | PRINTSTRING_OUTLINE | (ring->selectedIndex == 0 ? PRINTSTRING_BLINK : 0)); - PrintString(400, y, g_GameFlow->GetString(ring->Configuration.EnableSound ? STRING_ENABLED : STRING_DISABLED), + drawString(400, y, g_GameFlow->GetString(ring->Configuration.EnableSound ? STRING_ENABLED : STRING_DISABLED), PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 0 ? PRINTSTRING_BLINK : 0)); y += 25; // Enable sound special effects - PrintString(200, y, g_GameFlow->GetString(STRING_SPECIAL_SOUND_FX), + drawString(200, y, g_GameFlow->GetString(STRING_SPECIAL_SOUND_FX), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_DONT_UPDATE_BLINK | PRINTSTRING_OUTLINE | (ring->selectedIndex == 1 ? PRINTSTRING_BLINK : 0)); - PrintString(400, y, g_GameFlow->GetString(ring->Configuration.EnableAudioSpecialEffects ? STRING_ENABLED : STRING_DISABLED), + drawString(400, y, g_GameFlow->GetString(ring->Configuration.EnableAudioSpecialEffects ? STRING_ENABLED : STRING_DISABLED), PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 1 ? PRINTSTRING_BLINK : 0)); y += 25; // Music volume - PrintString(200, y, g_GameFlow->GetString(STRING_MUSIC_VOLUME), + drawString(200, y, g_GameFlow->GetString(STRING_MUSIC_VOLUME), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 2 ? PRINTSTRING_BLINK : 0)); //DrawBar(400, y + 4, 150, 18, ring->Configuration.MusicVolume, 0x0000FF, 0x0000FF); - DrawBar(ring->Configuration.MusicVolume / 100.0f, g_MusicVolumeBar); + drawBar(ring->Configuration.MusicVolume / 100.0f, g_MusicVolumeBar); y += 25; // Sound FX volume - PrintString(200, y, g_GameFlow->GetString(STRING_SFX_VOLUME), + drawString(200, y, g_GameFlow->GetString(STRING_SFX_VOLUME), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_OUTLINE | (ring->selectedIndex == 3 ? PRINTSTRING_BLINK : 0)); //DrawBar(400, y + 4, 150, 18, ring->Configuration.SfxVolume, 0x0000FF, 0x0000FF); - DrawBar(ring->Configuration.SfxVolume / 100.0f, g_SFXVolumeBar); + drawBar(ring->Configuration.SfxVolume / 100.0f, g_SFXVolumeBar); y += 25; // Apply and cancel - PrintString(400, y, g_GameFlow->GetString(STRING_APPLY), + drawString(400, y, g_GameFlow->GetString(STRING_APPLY), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == 4 ? PRINTSTRING_BLINK : 0)); y += 25; - PrintString(400, y, g_GameFlow->GetString(STRING_CANCEL), + drawString(400, y, g_GameFlow->GetString(STRING_CANCEL), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == 5 ? PRINTSTRING_BLINK : 0)); @@ -925,27 +920,27 @@ namespace T5M::Renderer // Draw sound menu y = 40; - PrintString(400, y, g_GameFlow->GetString(STRING_CONTROLS), + drawString(400, y, g_GameFlow->GetString(STRING_CONTROLS), PRINTSTRING_COLOR_YELLOW, PRINTSTRING_OUTLINE | PRINTSTRING_CENTER); y += 25; for (int k = 0; k < 18; k++) { - PrintString(200, y, g_GameFlow->GetString(STRING_CONTROLS_MOVE_FORWARD + k), + drawString(200, y, g_GameFlow->GetString(STRING_CONTROLS_MOVE_FORWARD + k), PRINTSTRING_COLOR_WHITE, PRINTSTRING_OUTLINE | (ring->selectedIndex == k ? PRINTSTRING_BLINK : 0) | (ring->waitingForKey ? PRINTSTRING_DONT_UPDATE_BLINK : 0)); if (ring->waitingForKey && k == ring->selectedIndex) { - PrintString(400, y, g_GameFlow->GetString(STRING_WAITING_FOR_KEY), + drawString(400, y, g_GameFlow->GetString(STRING_WAITING_FOR_KEY), PRINTSTRING_COLOR_YELLOW, PRINTSTRING_OUTLINE | PRINTSTRING_BLINK); } else { - PrintString(400, y, (char *)g_KeyNames[KeyboardLayout[1][k]], + drawString(400, y, (char *)g_KeyNames[KeyboardLayout[1][k]], PRINTSTRING_COLOR_ORANGE, PRINTSTRING_OUTLINE); } @@ -954,13 +949,13 @@ namespace T5M::Renderer } // Apply and cancel - PrintString(400, y, g_GameFlow->GetString(STRING_APPLY), + drawString(400, y, g_GameFlow->GetString(STRING_APPLY), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == NUM_CONTROLS + 0 ? PRINTSTRING_BLINK : 0)); y += 25; - PrintString(400, y, g_GameFlow->GetString(STRING_CANCEL), + drawString(400, y, g_GameFlow->GetString(STRING_CANCEL), PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == NUM_CONTROLS + 1 ? PRINTSTRING_BLINK : 0)); @@ -980,7 +975,7 @@ namespace T5M::Renderer { // Draw the description below the object char *string = g_GameFlow->GetString(g_Inventory.GetInventoryObject(inventoryItem)->objectName); // (char*)g_NewStrings[g_Inventory->GetInventoryObject(inventoryItem)->objectName].c_str(); // &AllStrings[AllStringsOffsets[g_Inventory->GetInventoryObject(inventoryItem)->objectName]]; - PrintString(400, 550, string, PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE); + drawString(400, 550, string, PRINTSTRING_COLOR_ORANGE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE); } } else @@ -1005,7 +1000,7 @@ namespace T5M::Renderer stringIndex = STRING_CHOOSE_AMMO; // Apply and cancel - PrintString(400, y, g_GameFlow->GetString(stringIndex), + drawString(400, y, g_GameFlow->GetString(stringIndex), PRINTSTRING_COLOR_WHITE, PRINTSTRING_CENTER | PRINTSTRING_OUTLINE | (ring->selectedIndex == a ? PRINTSTRING_BLINK : 0)); @@ -1111,11 +1106,11 @@ namespace T5M::Renderer } if (quantity < 1) - PrintString(400, 550, string, D3DCOLOR_ARGB(255, 216, 117, 49), PRINTSTRING_CENTER); + drawString(400, 550, string, D3DCOLOR_ARGB(255, 216, 117, 49), PRINTSTRING_CENTER); else { sprintf(stringBuffer, "%d x %s", quantity, string); - PrintString(400, 550, stringBuffer, D3DCOLOR_ARGB(255, 216, 117, 49), PRINTSTRING_CENTER); + drawString(400, 550, stringBuffer, D3DCOLOR_ARGB(255, 216, 117, 49), PRINTSTRING_CENTER); } } } @@ -1154,10 +1149,9 @@ namespace T5M::Renderer m_spriteBatch->End(); } - return 0; } - bool Renderer11::drawFullScreenQuad(ID3D11ShaderResourceView *texture, Vector3 color, bool cinematicBars) + void Renderer11::drawFullScreenQuad(ID3D11ShaderResourceView* texture, DirectX::SimpleMath::Vector3 color, bool cinematicBars) { RendererVertex vertices[4]; @@ -1238,11 +1232,10 @@ namespace T5M::Renderer m_primitiveBatch->DrawQuad(vertices[0], vertices[1], vertices[2], vertices[3]); m_primitiveBatch->End(); - return true; } - bool Renderer11::drawRopes() - { + void Renderer11::drawRopes() +{ for (int n = 0; n < NumRopes; n++) { ROPE_STRUCT *rope = &Ropes[n]; @@ -1342,7 +1335,7 @@ namespace T5M::Renderer Vector3 p3 = m_viewportToolkit->Unproject(Vector3(x3, y3, depth), Projection, View, world); Vector3 p4 = m_viewportToolkit->Unproject(Vector3(x4, y4, depth), Projection, View, world); - AddSprite3D(&m_sprites[20], + addSprite3D(&m_sprites[20], Vector3(p1.x, p1.y, p1.z), Vector3(p2.x, p2.y, p2.z), Vector3(p3.x, p3.y, p3.z), @@ -1357,11 +1350,10 @@ namespace T5M::Renderer } } - return true; } - bool Renderer11::drawLines2D() - { + void Renderer11::drawLines2D() +{ m_context->RSSetState(m_states->CullNone()); m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthRead(), 0); @@ -1412,11 +1404,10 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthDefault(), 0); - return true; } - bool Renderer11::drawSpiders() - { + void Renderer11::drawSpiders() +{ /*XMMATRIX world; UINT cPasses = 1; @@ -1479,12 +1470,10 @@ namespace T5M::Renderer } } }*/ - - return true; } - bool Renderer11::drawRats() - { + void Renderer11::drawRats() +{ UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -1531,11 +1520,10 @@ namespace T5M::Renderer } } - return true; } - bool Renderer11::drawBats() - { + void Renderer11::drawBats() +{ UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -1582,11 +1570,10 @@ namespace T5M::Renderer } } - return true; } - bool Renderer11::drawLittleBeetles() - { + void Renderer11::drawLittleBeetles() +{ UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -1632,13 +1619,11 @@ namespace T5M::Renderer } } } - - return true; } - bool Renderer11::doSnow() - { + void Renderer11::doSnow() +{ if (m_firstWeather) { for (int i = 0; i < NUM_SNOW_PARTICLES; i++) @@ -1683,7 +1668,7 @@ namespace T5M::Renderer continue; } - AddSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST], Vector3(snow->X, snow->Y, snow->Z), Vector4(1, 1, 1, 1), + addSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST], Vector3(snow->X, snow->Y, snow->Z), Vector4(1, 1, 1, 1), 0.0f, 1.0f, SNOW_SIZE, SNOW_SIZE, BLENDMODE_ALPHABLEND); @@ -1696,11 +1681,10 @@ namespace T5M::Renderer m_firstWeather = false; - return true; } - bool Renderer11::doRain() - { + void Renderer11::doRain() +{ if (m_firstWeather) { for (int i = 0; i < NUM_RAIN_DROPS; i++) @@ -1753,7 +1737,7 @@ namespace T5M::Renderer drop->Z += dz; if (drop->Draw) - AddLine3D(Vector3(x1, y1, z1), Vector3(drop->X, drop->Y, drop->Z), Vector4(RAIN_COLOR, RAIN_COLOR, RAIN_COLOR, 1.0f)); + addLine3D(Vector3(x1, y1, z1), Vector3(drop->X, drop->Y, drop->Z), Vector4(RAIN_COLOR, RAIN_COLOR, RAIN_COLOR, 1.0f)); // If rain drop has hit the ground, then reset it and add a little drip short roomNumber = Camera.pos.roomNumber; @@ -1767,12 +1751,10 @@ namespace T5M::Renderer } m_firstWeather = false; - - return true; } - bool Renderer11::drawLines3D() - { + void Renderer11::drawLines3D() +{ m_context->RSSetState(m_states->CullNone()); m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthRead(), 0); @@ -1805,10 +1787,9 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthDefault(), 0); - return true; } - void Renderer11::AddLine3D(Vector3 start, Vector3 end, Vector4 color) + void Renderer11::addLine3D(Vector3 start, Vector3 end, Vector4 color) { if (m_nextLine3D >= MAX_LINES_3D) return; @@ -1822,7 +1803,7 @@ namespace T5M::Renderer m_lines3DToDraw.push_back(line); } - void Renderer11::DrawLoadingScreen(std::wstring &fileName) + void Renderer11::renderLoadingScreen(std::wstring& fileName) { return; /* @@ -1875,7 +1856,7 @@ namespace T5M::Renderer */ } - void Renderer11::AddDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b) + void Renderer11::addDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b) { if (m_nextLight >= MAX_LIGHTS) return; @@ -1893,53 +1874,12 @@ namespace T5M::Renderer //NumDynamics++; } - void Renderer11::ClearDynamicLights() - { + void Renderer11::clearDynamicLights() +{ m_dynamicLights.clear(); } - int Renderer11::drawFinalPass() - { - return 0; - /* - // Update fade status - if (m_fadeStatus == RENDERER_FADE_STATUS::FADE_IN && m_fadeFactor > 0.99f) - m_fadeStatus = RENDERER_FADE_STATUS::NO_FADE; - - if (m_fadeStatus == RENDERER_FADE_STATUS::FADE_OUT && m_fadeFactor <= 0.01f) - m_fadeStatus = RENDERER_FADE_STATUS::NO_FADE; - - // Reset GPU state - m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); - m_context->RSSetState(m_states->CullCounterClockwise()); - m_context->OMSetDepthStencilState(m_states->DepthDefault(), 0); - - m_context->ClearRenderTargetView(target, Colors::Black); - m_context->ClearDepthStencilView(depthTarget, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); - m_context->OMSetRenderTargets(1, &target, depthTarget); - - drawFullScreenQuad(m_renderTarget.ShaderResourceView.Get(), Vector3(m_fadeFactor, m_fadeFactor, m_fadeFactor), m_enableCinematicBars); - - m_swapChain->Present(0, 0); - - // Update fade status - if (m_fadeStatus == RENDERER_FADE_STATUS::FADE_IN && m_fadeFactor < 1.0f) { - m_fadeFactor += FADE_FACTOR; - if (m_fadeFactor >= 0.9f) - m_fadeFactor = 1.0f; - } - - if (m_fadeStatus == RENDERER_FADE_STATUS::FADE_OUT && m_fadeStatus > 0.0f) { - m_fadeFactor -= FADE_FACTOR; - if (m_fadeFactor <= 0.1f) - m_fadeFactor = 0.0f; - } - - return 0; - */ - } - - bool Renderer11::drawFullScreenImage(ID3D11ShaderResourceView *texture, float fade, ID3D11RenderTargetView *target, ID3D11DepthStencilView *depthTarget) + void Renderer11::drawFullScreenImage(ID3D11ShaderResourceView* texture, float fade, ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget) { // Reset GPU state m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); @@ -1948,32 +1888,29 @@ namespace T5M::Renderer m_context->OMSetRenderTargets(1, &target, depthTarget); m_context->RSSetViewports(1, &m_viewport); drawFullScreenQuad(texture, Vector3(fade, fade, fade), false); - return true; } - int Renderer11::DrawInventory() - { + void Renderer11::renderInventory() +{ m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_STENCIL | D3D11_CLEAR_DEPTH, 1.0f, 0); m_context->ClearRenderTargetView(m_backBufferRTV, Colors::Black); - drawInventoryScene(m_backBufferRTV, m_depthStencilView, m_dumpScreenRenderTarget.ShaderResourceView.Get()); + renderInventoryScene(m_backBufferRTV, m_depthStencilView, m_dumpScreenRenderTarget.ShaderResourceView.Get()); m_swapChain->Present(0, 0); - return 0; } - int Renderer11::DrawTitle() - { + void Renderer11::renderTitle() +{ m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_STENCIL | D3D11_CLEAR_DEPTH, 1.0f, 0); m_context->ClearRenderTargetView(m_backBufferRTV, Colors::Black); - drawScene(m_backBufferRTV, m_depthStencilView, gameCamera); + renderScene(m_backBufferRTV, m_depthStencilView, gameCamera); m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_STENCIL | D3D11_CLEAR_DEPTH, 1.0f, 0); - drawInventoryScene(m_backBufferRTV, m_depthStencilView, nullptr); + renderInventoryScene(m_backBufferRTV, m_depthStencilView, nullptr); m_swapChain->Present(0, 0); - return 0; } - bool Renderer11::drawScene(ID3D11RenderTargetView *target, ID3D11DepthStencilView *depthTarget, RenderView &view) + void Renderer11::renderScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view) { using ns = std::chrono::nanoseconds; using get_time = std::chrono::steady_clock; @@ -2000,11 +1937,11 @@ namespace T5M::Renderer //prepareCameraForFrame(); clearSceneItems(); collectRooms(view); - UpdateLaraAnimations(false); + updateLaraAnimations(false); updateItemsAnimations(view); updateEffects(view); if (g_Configuration.EnableShadows) - drawShadowMap(view); + renderShadowMap(view); m_items[Lara.itemNumber].Item = LaraItem; collectLightsForItem(LaraItem->roomNumber, &m_items[Lara.itemNumber], view); @@ -2115,7 +2052,7 @@ namespace T5M::Renderer // Bars int flash = FlashIt(); if (DashTimer < 120) - DrawBar(DashTimer / 120.0f, g_DashBar); + drawBar(DashTimer / 120.0f, g_DashBar); UpdateHealthBar(flash); UpdateAirBar(flash); DrawAllPickups(); @@ -2161,10 +2098,9 @@ namespace T5M::Renderer drawAllStrings(); - return true; } - bool Renderer11::drawSimpleScene(ID3D11RenderTargetView *target, ID3D11DepthStencilView *depthTarget, RenderView &view) + void Renderer11::renderSimpleScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view) { GameScriptLevel *level = g_GameFlow->GetLevel(CurrentLevel); @@ -2194,16 +2130,14 @@ namespace T5M::Renderer m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); drawHorizonAndSky(depthTarget); drawRooms(false, false, view); - return true; } - int Renderer11::DumpGameScene() - { - drawScene(m_dumpScreenRenderTarget.RenderTargetView.Get(), m_dumpScreenRenderTarget.DepthStencilView.Get(), gameCamera); - return 0; + void Renderer11::DumpGameScene() +{ + renderScene(m_dumpScreenRenderTarget.RenderTargetView.Get(), m_dumpScreenRenderTarget.DepthStencilView.Get(), gameCamera); } - bool Renderer11::drawItems(bool transparent, bool animated, RenderView &view) + void Renderer11::drawItems(bool transparent, bool animated, RenderView& view) { UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -2266,10 +2200,9 @@ namespace T5M::Renderer } } - return true; } - bool Renderer11::drawAnimatingItem(RendererItem *item, bool transparent, bool animated) + void Renderer11::drawAnimatingItem(RendererItem* item, bool transparent, bool animated) { UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -2278,7 +2211,7 @@ namespace T5M::Renderer int lastBucket = (transparent ? 4 : 2); if (m_rooms.size() <= item->Item->roomNumber) { - return true; + return; } RendererRoom &const room = m_rooms[item->Item->roomNumber]; RendererObject &moveableObj = *m_moveableObjects[item->Item->objectNumber]; @@ -2331,10 +2264,9 @@ namespace T5M::Renderer } } - return true; } - bool Renderer11::drawScaledSpikes(RendererItem *item, bool transparent, bool animated) + void Renderer11::drawScaledSpikes(RendererItem* item, bool transparent, bool animated) { short objectNumber = item->Item->objectNumber; if ((item->Item->objectNumber != ID_TEETH_SPIKES || item->Item->itemFlags[1]) && (item->Item->objectNumber != ID_RAISING_BLOCK1 || item->Item->triggerFlags > -1)) @@ -2346,13 +2278,13 @@ namespace T5M::Renderer } } - bool Renderer11::drawWraithExtra(RendererItem* item, bool transparent, bool animated) + void Renderer11::drawWraithExtra(RendererItem* item, bool transparent, bool animated) { ITEM_INFO* nativeItem = item->Item; WRAITH_INFO* info = (WRAITH_INFO*)nativeItem->data; if (transparent || animated) - return true; + return ; for (int j = 0; j <= 4; j++) { @@ -2395,14 +2327,13 @@ namespace T5M::Renderer Vector3 p1 = Vector3(info[i].xPos, info[i].yPos, info[i].zPos); Vector3 p2 = Vector3(info[i + 1].xPos , info[i + 1].yPos, info[i + 1].zPos); - AddLine3D(p1, p2, Vector4(info[i].r / 255.0f, info[i].g / 255.0f, info[i].b / 255.0f, 1.0f)); + addLine3D(p1, p2, Vector4(info[i].r / 255.0f, info[i].g / 255.0f, info[i].b / 255.0f, 1.0f)); } } - return true; } - bool Renderer11::drawStatics(bool transparent, RenderView &view) + void Renderer11::drawStatics(bool transparent, RenderView& view) { //return true; UINT stride = sizeof(RendererVertex); @@ -2459,11 +2390,9 @@ namespace T5M::Renderer } } } - - return true; } - bool Renderer11::drawRooms(bool transparent, bool animated, RenderView &view) + void Renderer11::drawRooms(bool transparent, bool animated, RenderView& view) { UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -2570,18 +2499,16 @@ namespace T5M::Renderer if (animated) m_primitiveBatch->End(); - - return true; } - bool Renderer11::drawHorizonAndSky(ID3D11DepthStencilView *depthTarget) + void Renderer11::drawHorizonAndSky(ID3D11DepthStencilView* depthTarget) { // Update the sky GameScriptLevel *level = g_GameFlow->GetLevel(CurrentLevel); Vector4 color = Vector4(SkyColor1.r / 255.0f, SkyColor1.g / 255.0f, SkyColor1.b / 255.0f, 1.0f); if (!level->Horizon) - return true; + return ; if (BinocularRange) AlterFOV(14560 - BinocularRange); @@ -2739,22 +2666,15 @@ namespace T5M::Renderer // Clear just the Z-buffer so we can start drawing on top of the horizon m_context->ClearDepthStencilView(depthTarget, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); - return true; } - bool Renderer11::drawAmbientCubeMap(short roomNumber) - { - return true; - } - - int Renderer11::Draw() - { + void Renderer11::Draw() +{ renderToCubemap(m_reflectionCubemap, Vector3(LaraItem->pos.xPos, LaraItem->pos.yPos - 1024, LaraItem->pos.zPos), LaraItem->roomNumber); - drawScene(m_backBufferRTV, m_depthStencilView, gameCamera); + renderScene(m_backBufferRTV, m_depthStencilView, gameCamera); m_context->ClearState(); //drawFinalPass(); m_swapChain->Present(0, 0); - return 0; } } // namespace T5M::Renderer diff --git a/TR5Main/Renderer/Renderer11Draw2D.cpp b/TR5Main/Renderer/Renderer11Draw2D.cpp index 05f7637cf..6dcd95ade 100644 --- a/TR5Main/Renderer/Renderer11Draw2D.cpp +++ b/TR5Main/Renderer/Renderer11Draw2D.cpp @@ -9,7 +9,8 @@ T5M::Renderer::RendererHUDBar* g_MusicVolumeBar; T5M::Renderer::RendererHUDBar* g_SFXVolumeBar; namespace T5M::Renderer { - bool Renderer11::initialiseBars() { + void Renderer11::initialiseBars() +{ std::array healthColors = { //top Vector4(82 / 255.0f,0,0,1), @@ -73,9 +74,8 @@ namespace T5M::Renderer { g_DashBar = new RendererHUDBar(m_device, 630, 32 + 8 + 4, 150, 8, 1, dashColors); g_MusicVolumeBar = new RendererHUDBar(m_device, 400, 212, 150, 8, 1, soundSettingColors); g_SFXVolumeBar = new RendererHUDBar(m_device, 400, 230, 150, 8, 1, soundSettingColors); - return true; } - bool Renderer11::DrawBar(float percent, const RendererHUDBar* const bar) { + void Renderer11::drawBar(float percent, const RendererHUDBar* const bar) { UINT strides = sizeof(RendererVertex); UINT offset = 0; float color[] = { 0,0,0,1.0f }; @@ -111,12 +111,9 @@ namespace T5M::Renderer { m_context->OMSetDepthStencilState(m_states->DepthNone(), NULL); m_context->RSSetState(m_states->CullNone()); m_context->DrawIndexed(24, 0, 0); - - - return true; } - void Renderer11::AddLine2D(int x1, int y1, int x2, int y2, byte r, byte g, byte b, byte a) { + void Renderer11::addLine2D(int x1, int y1, int x2, int y2, byte r, byte g, byte b, byte a) { RendererLine2D* line = &m_lines2DBuffer[m_nextLine2D++]; line->Vertices[0] = Vector2(x1, y1); @@ -126,9 +123,10 @@ namespace T5M::Renderer { m_lines2DToDraw.push_back(line); } - bool Renderer11::drawOverlays() { + void Renderer11::drawOverlays() +{ if (!BinocularRange && !SpotcamOverlay) - return true; + return; m_context->OMSetBlendState(m_states->AlphaBlend(), NULL, 0xFFFFFFFF); drawFullScreenQuad(m_binocularsTexture.ShaderResourceView.Get(), Vector3::One, false); @@ -176,11 +174,9 @@ namespace T5M::Renderer { m_primitiveBatch->DrawQuad(vertices[0], vertices[1], vertices[2], vertices[3]); m_primitiveBatch->End(); } - - return true; } - bool Renderer11::drawColoredQuad(int x, int y, int w, int h, Vector4 color) { + void Renderer11::drawColoredQuad(int x, int y, int w, int h, DirectX::SimpleMath::Vector4 color) { float factorW = ScreenWidth / 800.0f; float factorH = ScreenHeight / 600.0f; @@ -197,14 +193,13 @@ namespace T5M::Renderer { int shiftW = 4 * factorW; int shiftH = 4 * factorH; - AddLine2D(rect.left + shiftW, rect.top + shiftH, rect.right - shiftW, rect.top + shiftH, 128, 128, 128, 128); - AddLine2D(rect.right - shiftW, rect.top + shiftH, rect.right - shiftW, rect.bottom - shiftH, 128, 128, 128, 128); - AddLine2D(rect.left + shiftW, rect.bottom - shiftH, rect.right - shiftW, rect.bottom - shiftH, 128, 128, 128, 128); - AddLine2D(rect.left + shiftW, rect.top + shiftH, rect.left + shiftW, rect.bottom - shiftH, 128, 128, 128, 128); + addLine2D(rect.left + shiftW, rect.top + shiftH, rect.right - shiftW, rect.top + shiftH, 128, 128, 128, 128); + addLine2D(rect.right - shiftW, rect.top + shiftH, rect.right - shiftW, rect.bottom - shiftH, 128, 128, 128, 128); + addLine2D(rect.left + shiftW, rect.bottom - shiftH, rect.right - shiftW, rect.bottom - shiftH, 128, 128, 128, 128); + addLine2D(rect.left + shiftW, rect.top + shiftH, rect.left + shiftW, rect.bottom - shiftH, 128, 128, 128, 128); m_context->OMSetDepthStencilState(m_states->DepthDefault(), 0); - return true; } } diff --git a/TR5Main/Renderer/Renderer11DrawEffect.cpp b/TR5Main/Renderer/Renderer11DrawEffect.cpp index c2d030dc2..2c860f45b 100644 --- a/TR5Main/Renderer/Renderer11DrawEffect.cpp +++ b/TR5Main/Renderer/Renderer11DrawEffect.cpp @@ -36,7 +36,7 @@ namespace T5M::Renderer { - void Renderer11::AddSprite3D(RendererSprite* sprite, Vector3 vtx1, Vector3 vtx2, Vector3 vtx3, Vector3 vtx4, Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode) { + void Renderer11::addSprite3D(RendererSprite* sprite, Vector3 vtx1, Vector3 vtx2, Vector3 vtx3, Vector3 vtx4, Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode) { if (m_nextSprite >= MAX_SPRITES) return; @@ -119,7 +119,7 @@ namespace T5M::Renderer { Vector3 d = pos2 - pos1; d.Normalize(); - AddSpriteBillboardConstrained(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_LIGHTHING], + addSpriteBillboardConstrained(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_LIGHTHING], c, Vector4(arc->r / 255.0f, arc->g / 255.0f, arc->b / 255.0f, alpha), SPRITE_ROTATION_90_DEGREES, @@ -138,7 +138,7 @@ namespace T5M::Renderer { SMOKE_SPARKS* spark = &SmokeSparks[i]; if (spark->on) { - AddSpriteBillboard(&m_sprites[spark->def], + addSpriteBillboard(&m_sprites[spark->def], Vector3(spark->x, spark->y, spark->z), Vector4(spark->shade / 255.0f, spark->shade / 255.0f, spark->shade / 255.0f, 1.0f), TO_RAD(spark->rotAng), spark->scalar, spark->size * 4.0f, spark->size * 4.0f, @@ -147,7 +147,7 @@ namespace T5M::Renderer { } } - void Renderer11::AddSpriteBillboard(RendererSprite* sprite, Vector3 pos, Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode) { + void Renderer11::addSpriteBillboard(RendererSprite* sprite, Vector3 pos, Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode) { if (m_nextSprite >= MAX_SPRITES) return; @@ -171,7 +171,7 @@ namespace T5M::Renderer { m_spritesToDraw.push_back(spr); } - void Renderer11::AddSpriteBillboardConstrained(RendererSprite* sprite, Vector3 pos, Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, Vector3 constrainAxis) { + void Renderer11::addSpriteBillboardConstrained(RendererSprite* sprite, Vector3 pos, Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, Vector3 constrainAxis) { if (m_nextSprite >= MAX_SPRITES) return; @@ -196,7 +196,7 @@ namespace T5M::Renderer { m_spritesToDraw.push_back(spr); } - void Renderer11::AddSpriteBillboardConstrainedLookAt(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, DirectX::SimpleMath::Vector3 lookAtAxis) { + void Renderer11::addSpriteBillboardConstrainedLookAt(RendererSprite* sprite, DirectX::SimpleMath::Vector3 pos, DirectX::SimpleMath::Vector4 color, float rotation, float scale, float width, float height, BLEND_MODES blendMode, DirectX::SimpleMath::Vector3 lookAtAxis) { if (m_nextSprite >= MAX_SPRITES) return; @@ -227,7 +227,7 @@ namespace T5M::Renderer { for (int i = 0; i < MAX_SPARKS_FIRE; i++) { FIRE_SPARKS* spark = &FireSparks[i]; if (spark->on) - AddSpriteBillboard(&m_sprites[spark->def], Vector3(fire->x + spark->x, fire->y + spark->y, fire->z + spark->z), Vector4(spark->r / 255.0f, spark->g / 255.0f, spark->b / 255.0f, 1.0f), TO_RAD(spark->rotAng), spark->scalar, spark->size * 4.0f, spark->size * 4.0f, BLENDMODE_ALPHABLEND); + addSpriteBillboard(&m_sprites[spark->def], Vector3(fire->x + spark->x, fire->y + spark->y, fire->z + spark->z), Vector4(spark->r / 255.0f, spark->g / 255.0f, spark->b / 255.0f, 1.0f), TO_RAD(spark->rotAng), spark->scalar, spark->size * 4.0f, spark->size * 4.0f, BLENDMODE_ALPHABLEND); } } } @@ -305,7 +305,7 @@ namespace T5M::Renderer { } } - AddSpriteBillboard(&m_sprites[spark->def], + addSpriteBillboard(&m_sprites[spark->def], pos, Vector4(spark->r / 255.0f, spark->g / 255.0f, spark->b / 255.0f, 1.0f), TO_RAD(spark->rotAng), spark->scalar, spark->size, spark->size, @@ -316,7 +316,7 @@ namespace T5M::Renderer { v.Normalize(); //AddSpriteBillboardConstrained(m_sprites[Objects[ID_SPARK_SPRITE].meshIndex], pos, Vector4(spark->r / 255.0f, spark->g / 255.0f, spark->b / 255.0f, 1.0f), TO_RAD(spark->rotAng), spark->scalar, spark., spark->size, BLENDMODE_ALPHABLEND, v); - AddLine3D(Vector3(spark->x, spark->y, spark->z), Vector3(spark->x + v.x * 24.0f, spark->y + v.y * 24.0f, spark->z + v.z * 24.0f), Vector4(spark->r / 255.0f, spark->g / 255.0f, spark->b / 255.0f, 1.0f)); + addLine3D(Vector3(spark->x, spark->y, spark->z), Vector3(spark->x + v.x * 24.0f, spark->y + v.y * 24.0f, spark->z + v.z * 24.0f), Vector4(spark->r / 255.0f, spark->g / 255.0f, spark->b / 255.0f, 1.0f)); } } } @@ -365,7 +365,7 @@ namespace T5M::Renderer { x2Outer += splash.x; z2Outer = outerRadius * cos(alpha * j * PI / 180); z2Outer += splash.z; - AddSprite3D(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + splash.spriteSequenceStart + (int)splash.animationPhase], Vector3(xOuter, yOuter, zOuter), Vector3(x2Outer, yOuter, z2Outer), Vector3(x2Inner, yInner, z2Inner), Vector3(xInner, yInner, zInner), Vector4(color / 255.0f, color / 255.0f, color / 255.0f, 1.0f), 0, 1, 0, 0, BLENDMODE_ALPHABLEND); + addSprite3D(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + splash.spriteSequenceStart + (int)splash.animationPhase], Vector3(xOuter, yOuter, zOuter), Vector3(x2Outer, yOuter, z2Outer), Vector3(x2Inner, yInner, z2Inner), Vector3(xInner, yInner, zInner), Vector4(color / 255.0f, color / 255.0f, color / 255.0f, 1.0f), 0, 1, 0, 0, BLENDMODE_ALPHABLEND); } } } @@ -375,7 +375,7 @@ namespace T5M::Renderer { for (int i = 0; i < MAX_BUBBLES; i++) { BUBBLE_STRUCT* bubble = &Bubbles[i]; if (bubble->active) - AddSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + bubble->spriteNum], Vector3(bubble->worldPosition.x, bubble->worldPosition.y, bubble->worldPosition.z), bubble->color, bubble->rotation, 1.0f, bubble->size * 0.5f, bubble->size * 0.5f, BLENDMODE_ALPHABLEND); + addSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + bubble->spriteNum], Vector3(bubble->worldPosition.x, bubble->worldPosition.y, bubble->worldPosition.z), bubble->color, bubble->rotation, 1.0f, bubble->size * 0.5f, bubble->size * 0.5f, BLENDMODE_ALPHABLEND); } } @@ -384,7 +384,7 @@ namespace T5M::Renderer { DRIP_STRUCT* drip = &Drips[i]; if (drip->on) { - AddLine3D(Vector3(drip->x, drip->y, drip->z), Vector3(drip->x, drip->y + 24.0f, drip->z), Vector4(drip->r / 255.0f, drip->g / 255.0f, drip->b / 255.0f, 1.0f)); + addLine3D(Vector3(drip->x, drip->y, drip->z), Vector3(drip->x, drip->y + 24.0f, drip->z), Vector4(drip->r / 255.0f, drip->g / 255.0f, drip->b / 255.0f, 1.0f)); } } } @@ -396,9 +396,9 @@ namespace T5M::Renderer { if (ripple->active) { float y = ripple->worldPos.y; if (ripple->isBillboard) { - AddSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + ripple->SpriteID], ripple->worldPos, ripple->currentColor, ripple->rotation, 1, ripple->size, ripple->size, BLENDMODE_ALPHABLEND); + addSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + ripple->SpriteID], ripple->worldPos, ripple->currentColor, ripple->rotation, 1, ripple->size, ripple->size, BLENDMODE_ALPHABLEND); } else { - AddSpriteBillboardConstrainedLookAt(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + ripple->SpriteID], ripple->worldPos, ripple->currentColor, ripple->rotation, 1, ripple->size*2, ripple->size*2, BLENDMODE_ALPHABLEND, Vector3(0,-1,0)); + addSpriteBillboardConstrainedLookAt(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + ripple->SpriteID], ripple->worldPos, ripple->currentColor, ripple->rotation, 1, ripple->size*2, ripple->size*2, BLENDMODE_ALPHABLEND, Vector3(0,-1,0)); //AddSprite3D(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + ripple->SpriteID], Vector3(x1, y, z2), Vector3(x2, y, z2), Vector3(x2, y, z1), Vector3(x1, y, z1), ripple->currentColor, 0.0f, 1.0f, ripple->size, ripple->size, BLENDMODE_ALPHABLEND); } } @@ -447,7 +447,7 @@ namespace T5M::Renderer { p2 = Vector3::Transform(p2, rotationMatrix); p3 = Vector3::Transform(p3, rotationMatrix); - AddSprite3D(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_SPLASH], + addSprite3D(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_SPLASH], pos + p1, pos + p2, pos + p3, @@ -471,7 +471,7 @@ namespace T5M::Renderer { BLOOD_STRUCT* blood = &Blood[i]; if (blood->on) { - AddSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_BLOOD], + addSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_BLOOD], Vector3(blood->x, blood->y, blood->z), Vector4(blood->shade / 255.0f, blood->shade * 0, blood->shade * 0, 1.0f), TO_RAD(blood->rotAng), 1.0f, blood->size * 8.0f, blood->size * 8.0f, @@ -585,7 +585,8 @@ namespace T5M::Renderer { return true; } - bool Renderer11::drawBaddieGunflashes() { + void Renderer11::drawBaddieGunflashes() +{ rand(); rand(); rand(); @@ -657,10 +658,9 @@ namespace T5M::Renderer { m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthDefault(), 0); - return true; } - Texture2D Renderer11::CreateDefaultNormalTexture() { + Texture2D Renderer11::createDefaultNormalTexture() { vector data = {128,128,255,1}; return Texture2D(m_device,1,1,data.data()); } @@ -684,7 +684,7 @@ namespace T5M::Renderer { p2 += Vector3(footprint.pos.xPos, footprint.pos.yPos, footprint.pos.zPos); p3 += Vector3(footprint.pos.xPos, footprint.pos.yPos, footprint.pos.zPos); p4 += Vector3(footprint.pos.xPos, footprint.pos.yPos, footprint.pos.zPos); - AddSprite3D(&m_sprites[spriteIndex], p1, p2, p3, p4, Vector4(footprint.opacity / 255.0f, footprint.opacity / 255.0f, footprint.opacity / 255.0f, footprint.opacity / 255.0f), 0, 1, 1, 1, BLENDMODE_SUBTRACTIVE); + addSprite3D(&m_sprites[spriteIndex], p1, p2, p3, p4, Vector4(footprint.opacity / 255.0f, footprint.opacity / 255.0f, footprint.opacity / 255.0f, footprint.opacity / 255.0f), 0, 1, 1, 1, BLENDMODE_SUBTRACTIVE); } } } @@ -723,7 +723,7 @@ namespace T5M::Renderer { dust->Life++; byte color = (dust->Life > 16 ? 32 - dust->Life : dust->Life) * 4; - AddSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST], Vector3(dust->X, dust->Y, dust->Z), Vector4(color / 255.0f, color / 255.0f, color / 255.0f, 1.0f), 0.0f, 1.0f, 12, 12, BLENDMODE_ALPHABLEND); + addSpriteBillboard(&m_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST], Vector3(dust->X, dust->Y, dust->Z), Vector4(color / 255.0f, color / 255.0f, color / 255.0f, 1.0f), 0.0f, 1.0f, 12, 12, BLENDMODE_ALPHABLEND); if (dust->Life >= 32) dust->Reset = true; @@ -734,7 +734,8 @@ namespace T5M::Renderer { return; } - bool Renderer11::drawSprites() { + void Renderer11::drawSprites() +{ UINT stride = sizeof(RendererVertex); UINT offset = 0; m_context->RSSetState(m_states->CullNone()); @@ -875,10 +876,9 @@ namespace T5M::Renderer { m_context->RSSetState(m_states->CullCounterClockwise()); m_context->OMSetDepthStencilState(m_states->DepthDefault(), 0); - return true; } - bool Renderer11::drawEffect(RendererEffect* effect, bool transparent) { + void Renderer11::drawEffect(RendererEffect* effect, bool transparent) { UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -919,10 +919,9 @@ namespace T5M::Renderer { m_numDrawCalls++; } - return true; } - bool Renderer11::drawEffects(bool transparent) { + void Renderer11::drawEffects(bool transparent) { UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -943,10 +942,10 @@ namespace T5M::Renderer { drawEffect(effect, transparent); } - return true; } - bool Renderer11::drawWaterfalls() { + void Renderer11::drawWaterfalls() +{ UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -1025,11 +1024,9 @@ namespace T5M::Renderer { continue; } } - - return true; } - bool Renderer11::drawDebris(bool transparent) { + void Renderer11::drawDebris(bool transparent) { /*UINT cPasses = 1; // First collect debrises @@ -1170,21 +1167,21 @@ namespace T5M::Renderer { m_primitiveBatch->End(); } } - return true; } - bool Renderer11::drawSmokeParticles() { + void Renderer11::drawSmokeParticles() +{ using T5M::Effects::Smoke::SmokeParticles; using T5M::Effects::Smoke::SmokeParticle; for (int i = 0; i < SmokeParticles.size(); i++) { SmokeParticle& s = SmokeParticles[i]; if (!s.active) continue; - AddSpriteBillboard(&m_sprites[Objects[ID_SMOKE_SPRITES].meshIndex + s.sprite], s.position, s.color, s.rotation, 1.0f, s.size, s.size, BLENDMODE_ALPHABLEND); + addSpriteBillboard(&m_sprites[Objects[ID_SMOKE_SPRITES].meshIndex + s.sprite], s.position, s.color, s.rotation, 1.0f, s.size, s.size, BLENDMODE_ALPHABLEND); } - return true; } - bool Renderer11::drawSparkParticles() { + void Renderer11::drawSparkParticles() +{ using T5M::Effects::Spark::SparkParticle; using T5M::Effects::Spark::SparkParticles; extern std::array SparkParticles; @@ -1193,12 +1190,12 @@ namespace T5M::Renderer { if (!s.active) continue; Vector3 v; s.velocity.Normalize(v); - AddSpriteBillboardConstrained(&m_sprites[Objects[ID_SPARK_SPRITE].meshIndex], s.pos, s.color, 0, 1, s.width, s.height, BLENDMODE_ALPHABLEND, v); + addSpriteBillboardConstrained(&m_sprites[Objects[ID_SPARK_SPRITE].meshIndex], s.pos, s.color, 0, 1, s.width, s.height, BLENDMODE_ALPHABLEND, v); } - return true; } - bool Renderer11::drawDripParticles() { + void Renderer11::drawDripParticles() +{ using T5M::Effects::Drip::DripParticle; using T5M::Effects::Drip::dripParticles; using T5M::Effects::Drip::DRIP_WIDTH; @@ -1207,19 +1204,18 @@ namespace T5M::Renderer { if (!d.active) continue; Vector3 v; d.velocity.Normalize(v); - AddSpriteBillboardConstrained(&m_sprites[Objects[ID_DRIP_SPRITE].meshIndex], d.pos, d.color, 0, 1, DRIP_WIDTH, d.height, BLENDMODE_ALPHABLEND, v); + addSpriteBillboardConstrained(&m_sprites[Objects[ID_DRIP_SPRITE].meshIndex], d.pos, d.color, 0, 1, DRIP_WIDTH, d.height, BLENDMODE_ALPHABLEND, v); } - return true; } - bool Renderer11::drawExplosionParticles() { + void Renderer11::drawExplosionParticles() +{ using T5M::Effects::Explosion::explosionParticles; using T5M::Effects::Explosion::ExplosionParticle; for (int i = 0; i < explosionParticles.size(); i++) { ExplosionParticle& e = explosionParticles[i]; if (!e.active) continue; - AddSpriteBillboard(&m_sprites[Objects[ID_EXPLOSION_SPRITES].meshIndex + e.sprite], e.pos, e.tint, e.rotation, 1.0f, e.size, e.size, BLENDMODE_ALPHABLEND); + addSpriteBillboard(&m_sprites[Objects[ID_EXPLOSION_SPRITES].meshIndex + e.sprite], e.pos, e.tint, e.rotation, 1.0f, e.size, e.size, BLENDMODE_ALPHABLEND); } - return true; } } diff --git a/TR5Main/Renderer/Renderer11Frame.cpp b/TR5Main/Renderer/Renderer11Frame.cpp index 7762b78fc..174003abb 100644 --- a/TR5Main/Renderer/Renderer11Frame.cpp +++ b/TR5Main/Renderer/Renderer11Frame.cpp @@ -465,7 +465,7 @@ namespace T5M::Renderer } } - void Renderer11::ResetAnimations() + void Renderer11::resetAnimations() { for (int i = 0; i < NUM_ITEMS; i++) { diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 1ead12473..7956250c8 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -10,7 +10,7 @@ using std::vector; extern GameConfiguration g_Configuration; extern GameFlow* g_GameFlow; -bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND handle) +void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND handle) { HRESULT res; @@ -22,9 +22,7 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h ScreenWidth = w; ScreenHeight = h; Windowed = windowed; - - if (!initialiseScreen(w, h, refreshRate, windowed, handle, false)) - return false; + initialiseScreen(w, h, refreshRate, windowed, handle, false); // Initialise render states m_states = new CommonStates(m_device); @@ -177,10 +175,9 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h Utils::throwIfFailed(m_device->CreateSamplerState(&shadowSamplerDesc,&m_shadowSampler)); initialiseBars(); initQuad(m_device); - return true; } -bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, HWND handle, bool reset) +void T5M::Renderer::Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, HWND handle, bool reset) { HRESULT res; @@ -202,19 +199,13 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; IDXGIDevice* dxgiDevice = NULL; - res = m_device->QueryInterface(__uuidof(IDXGIDevice), (void**)& dxgiDevice); - if (FAILED(res)) - return false; + Utils::throwIfFailed(m_device->QueryInterface(__uuidof(IDXGIDevice), (void**)& dxgiDevice)); IDXGIAdapter* dxgiAdapter = NULL; - res = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)& dxgiAdapter); - if (FAILED(res)) - return false; + Utils::throwIfFailed(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)& dxgiAdapter)); IDXGIFactory* dxgiFactory = NULL; - res = dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)& dxgiFactory); - if (FAILED(res)) - return false; + Utils::throwIfFailed(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)& dxgiFactory)); if (reset) { @@ -224,9 +215,8 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, } m_swapChain = NULL; - res = dxgiFactory->CreateSwapChain(m_device, &sd, &m_swapChain); - if (FAILED(res)) - return false; + Utils::throwIfFailed(dxgiFactory->CreateSwapChain(m_device, &sd, &m_swapChain)); + dxgiFactory->MakeWindowAssociation(handle, 0); res = m_swapChain->SetFullscreenState(!windowed, NULL); @@ -237,14 +227,12 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, // Initialise the back buffer m_backBufferTexture = NULL; - res = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast (&m_backBufferTexture)); - if (FAILED(res)) - return false; + Utils::throwIfFailed(m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast (&m_backBufferTexture))); + m_backBufferRTV = NULL; - res = m_device->CreateRenderTargetView(m_backBufferTexture, NULL, &m_backBufferRTV); - if (FAILED(res)) - return false; + Utils::throwIfFailed(m_device->CreateRenderTargetView(m_backBufferTexture, NULL, &m_backBufferRTV)); + D3D11_TEXTURE2D_DESC depthStencilDesc; depthStencilDesc.Width = w; @@ -260,14 +248,12 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, depthStencilDesc.MiscFlags = 0; m_depthStencilTexture = NULL; - res = m_device->CreateTexture2D(&depthStencilDesc, NULL, &m_depthStencilTexture); - if (FAILED(res)) - return false; + Utils::throwIfFailed(m_device->CreateTexture2D(&depthStencilDesc, NULL, &m_depthStencilTexture)); + m_depthStencilView = NULL; - res = m_device->CreateDepthStencilView(m_depthStencilTexture, NULL, &m_depthStencilView); - if (FAILED(res)) - return false; + Utils::throwIfFailed(m_device->CreateDepthStencilView(m_depthStencilTexture, NULL, &m_depthStencilView)); + // Bind the back buffer and the depth stencil m_context->OMSetRenderTargets(1, &m_backBufferRTV, m_depthStencilView); @@ -354,10 +340,9 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, UpdateWindow(handle); - return true; } -bool Renderer11::Create() +void T5M::Renderer::Renderer11::Create() { D3D_FEATURE_LEVEL levels[] = {D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_11_1}; @@ -371,7 +356,6 @@ bool Renderer11::Create() #endif Utils::throwIfFailed(res); - return true; } void Renderer11::initialiseHairRemaps() diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 4deb1be2e..a3f0243df 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -13,7 +13,7 @@ using namespace T5M::Renderer; extern GameFlow *g_GameFlow; -void Renderer11::UpdateLaraAnimations(bool force) +void Renderer11::updateLaraAnimations(bool force) { Matrix translation; Matrix rotation; @@ -138,11 +138,11 @@ void Renderer11::UpdateLaraAnimations(bool force) m_items[Lara.itemNumber].DoneAnimations = true; } -bool Renderer11::drawLara(bool transparent, bool shadowMap) +void T5M::Renderer::Renderer11::drawLara(bool transparent, bool shadowMap) { // Don't draw Lara if binoculars or sniper if (BinocularRange || SpotcamOverlay || SpotcamDontDrawLara || CurrentLevel == 0) - return true; + return; UINT stride = sizeof(RendererVertex); UINT offset = 0; @@ -277,8 +277,6 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap) } } } - - return true; } void Renderer11::drawLaraHolsters(bool transparent) diff --git a/TR5Main/Renderer/Renderer11PostProcess.cpp b/TR5Main/Renderer/Renderer11PostProcess.cpp index 0630e1c12..4e9f17391 100644 --- a/TR5Main/Renderer/Renderer11PostProcess.cpp +++ b/TR5Main/Renderer/Renderer11PostProcess.cpp @@ -1,16 +1,17 @@ #include "framework.h" #include "Renderer11.h" namespace T5M::Renderer { - void Renderer11::EnableCinematicBars(bool value) { + void Renderer11::enableCinematicBars(bool value) { m_enableCinematicBars = value; } - void Renderer11::FadeIn() { + void Renderer11::fadeIn() +{ m_fadeStatus = RENDERER_FADE_STATUS::FADE_IN; m_fadeFactor = 0.0f; } - void Renderer11::FadeOut() { + void Renderer11::fadeOut() { m_fadeStatus = RENDERER_FADE_STATUS::FADE_OUT; m_fadeFactor = 1.0f; } diff --git a/TR5Main/Renderer/Renderer11Settings.cpp b/TR5Main/Renderer/Renderer11Settings.cpp index 13e821859..e5ffd3aec 100644 --- a/TR5Main/Renderer/Renderer11Settings.cpp +++ b/TR5Main/Renderer/Renderer11Settings.cpp @@ -2,11 +2,12 @@ #include "Renderer11.h" #include "winmain.h" namespace T5M::Renderer { - bool Renderer11::ToggleFullScreen() { - return true; + void Renderer11::toggleFullScreen() +{ + } - bool Renderer11::ChangeScreenResolution(int width, int height, int frequency, bool windowed) { + void Renderer11::changeScreenResolution(int width, int height, int frequency, bool windowed) { HRESULT res; /*if (windowed && !Windowed) @@ -150,20 +151,14 @@ namespace T5M::Renderer { return false;*/ IDXGIOutput* output; - res = m_swapChain->GetContainingOutput(&output); - if (FAILED(res)) - return false; + Utils::throwIfFailed(m_swapChain->GetContainingOutput(&output)); DXGI_SWAP_CHAIN_DESC scd; - res = m_swapChain->GetDesc(&scd); - if (FAILED(res)) - return false; + Utils::throwIfFailed(m_swapChain->GetDesc(&scd)); UINT numModes = 1024; DXGI_MODE_DESC modes[1024]; - res = output->GetDisplayModeList(scd.BufferDesc.Format, 0, &numModes, modes); - if (FAILED(res)) - return false; + Utils::throwIfFailed(output->GetDisplayModeList(scd.BufferDesc.Format, 0, &numModes, modes)); DXGI_MODE_DESC* mode = &modes[0]; for (int i = 0; i < numModes; i++) { @@ -172,17 +167,12 @@ namespace T5M::Renderer { break; } - res = m_swapChain->ResizeTarget(mode); - if (FAILED(res)) - return false; + Utils::throwIfFailed( m_swapChain->ResizeTarget(mode)); - if (!initialiseScreen(width, height, frequency, windowed, WindowsHandle, true)) - return false; + initialiseScreen(width, height, frequency, windowed, WindowsHandle, true); ScreenWidth = width; ScreenHeight = height; Windowed = windowed; - - return true; } } diff --git a/TR5Main/Renderer/Renderer11String.cpp b/TR5Main/Renderer/Renderer11String.cpp index 9f4c7a687..9ee96e614 100644 --- a/TR5Main/Renderer/Renderer11String.cpp +++ b/TR5Main/Renderer/Renderer11String.cpp @@ -1,7 +1,7 @@ #include "framework.h" #include "Renderer11.h" namespace T5M::Renderer { - bool Renderer11::PrintString(int x, int y, char* string, D3DCOLOR color, int flags) { + void Renderer11::drawString(int x, int y, char* string, D3DCOLOR color, int flags) { int realX = x; int realY = y; float factorX = ScreenWidth / 800.0f; @@ -59,10 +59,10 @@ namespace T5M::Renderer { m_strings.push_back(str); - return true; } - bool Renderer11::drawAllStrings() { + void Renderer11::drawAllStrings() +{ m_spriteBatch->Begin(); for (int i = 0; i < m_strings.size(); i++) { @@ -80,7 +80,6 @@ namespace T5M::Renderer { m_spriteBatch->End(); - return true; } } diff --git a/TR5Main/Renderer/Utils.cpp b/TR5Main/Renderer/Utils.cpp index bba86b784..ba2c938f7 100644 --- a/TR5Main/Renderer/Utils.cpp +++ b/TR5Main/Renderer/Utils.cpp @@ -1,12 +1,17 @@ #include "framework.h" #include "Utils.h" #include +#include namespace T5M::Renderer::Utils { using std::wstring; using std::string; void Utils::throwIfFailed(const HRESULT& res) noexcept { - if(FAILED(res)) - throw std::exception("An error occured!"); + if(FAILED(res)){ + std::string message = std::system_category().message(res); + std::cout << message << std::endl; + throw std::runtime_error("An error occured!"); + } + } ID3D11VertexShader* compileVertexShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ID3D10Blob** bytecode) { diff --git a/TR5Main/Specific/configuration.cpp b/TR5Main/Specific/configuration.cpp index ec134dda4..2d7b68ccd 100644 --- a/TR5Main/Specific/configuration.cpp +++ b/TR5Main/Specific/configuration.cpp @@ -18,7 +18,7 @@ void LoadResolutionsInCombobox(HWND handle, int index) SendMessageA(cbHandle, CB_RESETCONTENT, 0, 0); - vector* adapters = g_Renderer.GetAdapters(); + vector* adapters = g_Renderer.getAdapters(); RendererVideoAdapter* adapter = &(*adapters)[index]; for (int i = 0; i < adapter->DisplayModes.size(); i++) @@ -44,7 +44,7 @@ void LoadAdaptersInCombobox(HWND handle) SendMessageA(cbHandle, CB_RESETCONTENT, 0, 0); - vector* adapters = g_Renderer.GetAdapters(); + vector* adapters = g_Renderer.getAdapters(); for (int i = 0; i < adapters->size(); i++) { RendererVideoAdapter* adapter = &(*adapters)[i]; @@ -140,7 +140,7 @@ BOOL CALLBACK DialogProc(HWND handle, UINT msg, WPARAM wParam, LPARAM lParam) g_Configuration.EnableSound = (SendDlgItemMessage(handle, IDC_ENABLE_SOUNDS, BM_GETCHECK, 0, 0)); g_Configuration.Adapter = (SendDlgItemMessage(handle, IDC_GFXADAPTER, CB_GETCURSEL, 0, 0)); selectedMode = (SendDlgItemMessage(handle, IDC_RESOLUTION, CB_GETCURSEL, 0, 0)); - adapter = &(*g_Renderer.GetAdapters())[g_Configuration.Adapter]; + adapter = &(*g_Renderer.getAdapters())[g_Configuration.Adapter]; mode = &(adapter->DisplayModes[selectedMode]); g_Configuration.Width = mode->Width; g_Configuration.Height = mode->Height; diff --git a/TR5Main/Specific/level.cpp b/TR5Main/Specific/level.cpp index 3b708bfbd..5cb693e2c 100644 --- a/TR5Main/Specific/level.cpp +++ b/TR5Main/Specific/level.cpp @@ -695,7 +695,7 @@ void FreeLevel() g_Level.Zones[j][i].clear(); } } - g_Renderer.FreeRendererData(); + g_Renderer.freeRendererData(); g_GameScript->FreeLevelScripts(); } @@ -807,7 +807,7 @@ unsigned CALLBACK LoadLevel(void* data) LevelFilePtr = NULL; char* baseLevelDataPtr = NULL; - g_Renderer.UpdateProgress(0); + g_Renderer.updateProgress(0); LevelFilePtr = FileOpen(filename); if (LevelFilePtr) @@ -835,21 +835,21 @@ unsigned CALLBACK LoadLevel(void* data) LoadTextures(); - g_Renderer.UpdateProgress(20); + g_Renderer.updateProgress(20); WeatherType = ReadInt8(); LaraDrawType = ReadInt8(); LoadRooms(); - g_Renderer.UpdateProgress(40); + g_Renderer.updateProgress(40); LoadObjects(); - g_Renderer.UpdateProgress(50); + g_Renderer.updateProgress(50); LoadSprites(); LoadCameras(); LoadSoundEffects(); - g_Renderer.UpdateProgress(60); + g_Renderer.updateProgress(60); LoadBoxes(); @@ -857,12 +857,12 @@ unsigned CALLBACK LoadLevel(void* data) LoadAnimatedTextures(); LoadTextureInfos(); - g_Renderer.UpdateProgress(70); + g_Renderer.updateProgress(70); LoadItems(); LoadAIObjects(); LoadSamples(); - g_Renderer.UpdateProgress(80); + g_Renderer.updateProgress(80); free(baseLevelDataPtr); LevelDataPtr = NULL; @@ -873,7 +873,7 @@ unsigned CALLBACK LoadLevel(void* data) return false; } - g_Renderer.UpdateProgress(90); + g_Renderer.updateProgress(90); g_Renderer.PrepareDataForTheRenderer(); // Initialise the game @@ -894,7 +894,7 @@ unsigned CALLBACK LoadLevel(void* data) // Level loaded IsLevelLoading = false; - g_Renderer.UpdateProgress(100); + g_Renderer.updateProgress(100); _endthreadex(1); @@ -1001,7 +1001,7 @@ int S_LoadLevelFile(int levelIndex) wchar_t loadscreenFileName[80]; std::mbstowcs(loadscreenFileName, level->LoadScreenFileName.c_str(),80); std::wstring loadScreenFile = std::wstring(loadscreenFileName); - g_Renderer.DrawLoadingScreen(loadScreenFile); + g_Renderer.renderLoadingScreen(loadScreenFile); while (IsLevelLoading); diff --git a/TR5Main/Specific/winmain.cpp b/TR5Main/Specific/winmain.cpp index 5e3ef18d2..7df623225 100644 --- a/TR5Main/Specific/winmain.cpp +++ b/TR5Main/Specific/winmain.cpp @@ -60,10 +60,10 @@ void CALLBACK HandleWmCommand(unsigned short wParam) if (!IsLevelLoading) { SuspendThread((HANDLE)ThreadHandle); - g_Renderer.ToggleFullScreen(); + g_Renderer.toggleFullScreen(); ResumeThread((HANDLE)ThreadHandle); - if (g_Renderer.IsFullsScreen()) + if (g_Renderer.isFullsScreen()) { SetCursor(0); ShowCursor(false); From 69cce438e4ba7cfb940417157d5d9513f011fe5c Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Sun, 9 Aug 2020 17:18:21 +0200 Subject: [PATCH 08/22] Fixed GetRoomList; Fixed GetCollidedObjcts; Enabled again disabled weapons; --- TR5Main/Game/collide.cpp | 2 +- TR5Main/Game/larafire.cpp | 6 ------ TR5Main/Game/laramisc.cpp | 10 ++++------ TR5Main/Game/misc.cpp | 9 ++++++--- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/TR5Main/Game/collide.cpp b/TR5Main/Game/collide.cpp index 37e828f47..6364bf008 100644 --- a/TR5Main/Game/collide.cpp +++ b/TR5Main/Game/collide.cpp @@ -61,7 +61,7 @@ int CollideStaticObjects(COLL_INFO* coll, int x, int y, int z, short roomNumber, for (int i = 0; i < numRooms; i++) { room = &g_Level.Rooms[roomList[i]]; - for (int j = room->mesh.size(); j > 0; j--, mesh++) + for (int j = 0; j < room->mesh.size(); j++, mesh++) { mesh = &room->mesh[j]; STATIC_INFO* sInfo = &StaticObjects[mesh->staticNumber]; diff --git a/TR5Main/Game/larafire.cpp b/TR5Main/Game/larafire.cpp index 5acb19d1d..431bab75d 100644 --- a/TR5Main/Game/larafire.cpp +++ b/TR5Main/Game/larafire.cpp @@ -448,11 +448,9 @@ void LaraGun() // (F) (D) case WEAPON_SHOTGUN: case WEAPON_CROSSBOW: case WEAPON_HK: -#if 0 case WEAPON_GRENADE_LAUNCHER: case WEAPON_ROCKET_LAUNCHER: case WEAPON_HARPOON_GUN: -#endif if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA) Camera.type = COMBAT_CAMERA; draw_shotgun(Lara.gunType); @@ -487,11 +485,9 @@ void LaraGun() // (F) (D) case WEAPON_SHOTGUN: case WEAPON_CROSSBOW: case WEAPON_HK: -#if 0 case WEAPON_GRENADE_LAUNCHER: case WEAPON_ROCKET_LAUNCHER: case WEAPON_HARPOON_GUN: -#endif undraw_shotgun(Lara.gunType); break; @@ -534,11 +530,9 @@ void LaraGun() // (F) (D) case WEAPON_SHOTGUN: case WEAPON_CROSSBOW: case WEAPON_HK: -#if 0 case WEAPON_GRENADE_LAUNCHER: case WEAPON_ROCKET_LAUNCHER: case WEAPON_HARPOON_GUN: -#endif case WEAPON_REVOLVER: RifleHandler(Lara.gunType); break; diff --git a/TR5Main/Game/laramisc.cpp b/TR5Main/Game/laramisc.cpp index 5e6f33815..83a61b2c5 100644 --- a/TR5Main/Game/laramisc.cpp +++ b/TR5Main/Game/laramisc.cpp @@ -138,7 +138,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] = -1; } -/* if (Objects[ID_HARPOON_ITEM].loaded) + if (Objects[ID_HARPOON_ITEM].loaded) { Lara.Weapons[WEAPON_HARPOON_GUN].Present = true; Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = WEAPON_AMMO1; @@ -164,7 +164,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_ROCKET_LAUNCHER].HasLasersight = false; Lara.Weapons[WEAPON_ROCKET_LAUNCHER].HasSilencer = false; Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] = -1; - }*/ + } if (Objects[ID_HK_ITEM].loaded) { @@ -175,7 +175,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] = -1; } -/* if (Objects[ID_CROSSBOW_ITEM].loaded) + if (Objects[ID_CROSSBOW_ITEM].loaded) { Lara.Weapons[ID_CROSSBOW_ITEM].Present = true; Lara.Weapons[ID_CROSSBOW_ITEM].SelectedAmmo = WEAPON_AMMO1; @@ -184,9 +184,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[ID_CROSSBOW_ITEM].Ammo[WEAPON_AMMO1] = -1; Lara.Weapons[ID_CROSSBOW_ITEM].Ammo[WEAPON_AMMO2] = -1; Lara.Weapons[ID_CROSSBOW_ITEM].Ammo[WEAPON_AMMO3] = -1; - }*/ - - /*Commented out the blocks for weapons that don't work ingame, after they're fixed, it'll be okay to uncomment*/ + } g_Inventory.LoadObjects(false); } diff --git a/TR5Main/Game/misc.cpp b/TR5Main/Game/misc.cpp index 41dc324ba..e8fc614ad 100644 --- a/TR5Main/Game/misc.cpp +++ b/TR5Main/Game/misc.cpp @@ -50,13 +50,13 @@ void TargetNearestEntity(ITEM_INFO* item, CREATURE_INFO* creature) void GetRoomList(short roomNumber, short* roomArray, short* numRooms) { - if (*numRooms <= 0) - return; short numDoors, * door, adjoiningRoom; int i, j; bool adjoiningRoomFound; roomArray[0] = roomNumber; + *numRooms = 1; + ROOM_INFO* room = &g_Level.Rooms[roomNumber]; for (i = 0; i < room->doors.size(); i++) @@ -74,7 +74,10 @@ void GetRoomList(short roomNumber, short* roomArray, short* numRooms) } if (!adjoiningRoomFound) - roomArray[*(numRooms++)] = adjoiningRoom; + { + roomArray[*numRooms] = adjoiningRoom; + *numRooms = *numRooms + 1; + } } } From 270343fd60853eadc11e2bf97ca506aad86bdb01 Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Sun, 9 Aug 2020 20:29:31 +0200 Subject: [PATCH 09/22] Fixed Lara damage on grenade hit; Fixed EffectList[] init; getBoneMatrix now valid for both Lara and other items; Added code (not working yet) for enemy explosion death; --- TR5Main/Game/collide.cpp | 2 +- TR5Main/Game/items.cpp | 6 +- TR5Main/Game/lara1gun.cpp | 8 +- TR5Main/Game/tomb4fx.cpp | 190 ++++++++++++---------------- TR5Main/Renderer/Render11Helper.cpp | 14 +- 5 files changed, 98 insertions(+), 122 deletions(-) diff --git a/TR5Main/Game/collide.cpp b/TR5Main/Game/collide.cpp index 6364bf008..048cae89b 100644 --- a/TR5Main/Game/collide.cpp +++ b/TR5Main/Game/collide.cpp @@ -211,7 +211,7 @@ int GetCollidedObjects(ITEM_INFO* collidingItem, int radius, int onlyVisible, IT ANIM_FRAME* framePtr = GetBestFrame(item); - if (Objects[item->objectNumber].drawRoutine + if ((Objects[item->objectNumber].drawRoutine || item->objectNumber == ID_LARA) && item->meshBits && (!onlyVisible || item->status != ITEM_INVISIBLE) && dx >= -2048 diff --git a/TR5Main/Game/items.cpp b/TR5Main/Game/items.cpp index 836cff873..585259407 100644 --- a/TR5Main/Game/items.cpp +++ b/TR5Main/Game/items.cpp @@ -279,12 +279,12 @@ void InitialiseFXArray(int allocmem) NextFxActive = NO_ITEM; NextFxFree = 0; - for (int i = 1; i < NUM_EFFECTS; i++, fx++) + for (int i = 0; i < NUM_EFFECTS; i++) { fx = &EffectList[i]; - fx->nextFx = i; + fx->nextFx = i + 1; } - fx->nextFx = -1; + EffectList[NUM_EFFECTS - 1].nextFx = NO_ITEM; } void RemoveDrawnItem(short itemNum) diff --git a/TR5Main/Game/lara1gun.cpp b/TR5Main/Game/lara1gun.cpp index efad0844a..930402895 100644 --- a/TR5Main/Game/lara1gun.cpp +++ b/TR5Main/Game/lara1gun.cpp @@ -632,7 +632,7 @@ void ControlGrenade(short itemNumber) { TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); currentItem->pos.yPos -= 128; - //TriggerShockwave(¤tItem->pos, 48, 304, 64, 0, 96, 128, 24, 0, 0); // CHECK + TriggerShockwave(¤tItem->pos, 48, 304, 64, 0, 96, 128, 24, 0, 0); currentItem->pos.yPos += 128; ExplodeItemNode(currentItem, 0, 0, 128); short currentItemNumber = (currentItem - g_Level.Items.data()); @@ -1368,10 +1368,10 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src) HitTarget(dest, 0, 30, 1); if (dest != LaraItem) { - ++Savegame.Game.AmmoHits; - if (src->hitPoints <= 0) + Savegame.Game.AmmoHits++; + if (dest->hitPoints <= 0) { - ++Savegame.Level.Kills; + Savegame.Level.Kills++; CreatureDie((dest - g_Level.Items.data()), 1); } } diff --git a/TR5Main/Game/tomb4fx.cpp b/TR5Main/Game/tomb4fx.cpp index ed90fb7cf..570557454 100644 --- a/TR5Main/Game/tomb4fx.cpp +++ b/TR5Main/Game/tomb4fx.cpp @@ -11,6 +11,13 @@ #include "GameFlowScript.h" #include "smoke.h" #include "drip.h" +#include +#include "Renderer11.h" +#include +#include + +using std::vector; +using T5M::Renderer::g_Renderer; char FlareTable[121] = { @@ -1205,151 +1212,110 @@ int ExplodingDeath(short itemNumber, int meshBits, short flags) TO_RAD(item->pos.zRot) ); - // PHD_MATH: - /*phd_PushUnitMatrix(); - - MatrixPtr[M03] = 0; - MatrixPtr[M13] = 0; - MatrixPtr[M23] = 0; + int bit = 1; - phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot); - phd_TranslateRel(frame[6], frame[7], frame[8]); - - short* rotation = &frame[9]; - gar_RotYXZsuperpack(&rotation, 0); - - short* extraRotation = (short*)item->data; - - int* bone = &Bones[obj->boneIndex]; - - int bits = 1; - if (meshBits & 1 && item->meshBits & 1) + if ((bit & meshBits) && (bit & item->meshBits)) { - if (flags & 0x100 || !(GetRandomControl() & 3)) + if ((GetRandomControl() & 3) == 0) { - Matrix boneMatrix = g_Renderer->GetBoneMatrix(item, 0); - - int fxNumber = CreateNewEffect(item->roomNumber); + short fxNumber = CreateNewEffect(item->roomNumber); if (fxNumber != NO_ITEM) { - FX_INFO* fx = &Effects[fxNumber]; - fx->pos.xPos = item->pos.xPos + boneMatrix.Translation().x; // (MatrixPtr[M03] >> W2V_SHIFT); - fx->pos.yPos = item->pos.yPos + boneMatrix.Translation().y; // (MatrixPtr[M13] >> W2V_SHIFT); - fx->pos.zPos = item->pos.zPos + boneMatrix.Translation().z; // (MatrixPtr[M23] >> W2V_SHIFT); - fx->roomNumber = item->roomNumber; - fx->pos.yRot = 0; - fx->pos.zRot = 0; - fx->pos.xRot = 0; + FX_INFO* fx = &EffectList[fxNumber]; - if (flags & 0x10) - { - fx->speed = 0; - } - else + Matrix boneMatrix; + g_Renderer.getBoneMatrix(itemNumber, 0, &boneMatrix); + boneMatrix = world * boneMatrix; + + fx->pos.xPos = boneMatrix.Translation().x + item->pos.xPos; + fx->pos.yPos = boneMatrix.Translation().y + item->pos.yPos; + fx->pos.zPos = boneMatrix.Translation().z + item->pos.zPos; + + fx->roomNumber = item->roomNumber; + fx->pos.xRot = 0; + fx->pos.yRot = GetRandomControl() * 2; + + if (!(flags & 0x10)) { if (flags & 0x20) fx->speed = GetRandomControl() >> 12; else fx->speed = GetRandomControl() >> 8; } + if (flags & 0x40) - { fx->fallspeed = 0; - } else { - if ((flags & 0x80u) == 0) + if ((flags & 0x80) == 0) fx->fallspeed = -(GetRandomControl() >> 8); else fx->fallspeed = -(GetRandomControl() >> 12); } - fx->frameNumber = obj->meshIndex; fx->objectNumber = ID_BODY_PART; + fx->frameNumber = obj->meshIndex; fx->shade = 16912; - fx->flag2 = damage; - - if (item->objectNumber == ID_CRUMBLING_FLOOR) - { - fx->speed = 0; - fx->fallspeed = 0; - fx->counter = 61; - } - else - { - fx->counter = 0; - } - fx->flag1 = 0; + fx->flag2 = flags; } - - item->meshBits--; + + item->meshBits -= bit; } } - for (int i = 1; i < obj->nmeshes; i++, bone += 3) + for (int i = 1; i < obj->nmeshes; i++) { - bits <<= 1; + Matrix boneMatrix; + g_Renderer.getBoneMatrix(itemNumber, i, &boneMatrix); + boneMatrix = world * boneMatrix; - if (bits & meshBits && bits & item->meshBits && (damage & 0x100 || !(GetRandomControl() & 3))) + bit <<= 1; + if ((bit & meshBits) && (bit & item->meshBits)) { - Matrix boneMatrix = g_Renderer->GetBoneMatrix(item, i); - Matrix matrix = boneMatrix * world; - - int fxNumber = CreateNewEffect(item->roomNumber); - if (fxNumber != NO_ITEM) + if ((GetRandomControl() & 3) == 0 && (flags & 0x100)) { - FX_INFO* fx = &Effects[fxNumber]; - fx->pos.xPos = item->pos.xPos + matrix.Translation().x; // (MatrixPtr[3] >> 14); - fx->pos.yPos = item->pos.yPos + matrix.Translation().y; // (MatrixPtr[7] >> 14); - fx->pos.zPos = item->pos.zPos + matrix.Translation().z; // (MatrixPtr[11] >> 14); - fx->roomNumber = item->roomNumber; - fx->pos.yRot = 0; - fx->pos.zRot = 0; - fx->pos.xRot = 0; - if (damage & 0x10) + short fxNumber = CreateNewEffect(item->roomNumber); + if (fxNumber != NO_ITEM) { - fx->speed = 0; - } - else - { - if (damage & 0x20) - fx->speed = GetRandomControl() >> 12; + FX_INFO* fx = &EffectList[fxNumber]; + + fx->pos.xPos = boneMatrix.Translation().x + item->pos.xPos; + fx->pos.yPos = boneMatrix.Translation().y + item->pos.yPos; + fx->pos.zPos = boneMatrix.Translation().z + item->pos.zPos; + + fx->roomNumber = item->roomNumber; + fx->pos.xRot = 0; + fx->pos.yRot = GetRandomControl() * 2; + + if (!(flags & 0x10)) + { + if (flags & 0x20) + fx->speed = GetRandomControl() >> 12; + else + fx->speed = GetRandomControl() >> 8; + } + + if (flags & 0x40) + fx->fallspeed = 0; else - fx->speed = GetRandomControl() >> 8; + { + if ((flags & 0x80) == 0) + fx->fallspeed = -(GetRandomControl() >> 8); + else + fx->fallspeed = -(GetRandomControl() >> 12); + } + + fx->objectNumber = ID_BODY_PART; + fx->shade = 16912; + fx->flag2 = flags; + fx->frameNumber = obj->meshIndex + i; } - if (damage & 0x40) - { - fx->fallspeed = 0; - } - else - { - if ((damage & 0x80u) == 0) - fx->fallspeed = -(GetRandomControl() >> 8); - else - fx->fallspeed = -(GetRandomControl() >> 12); - } - fx->objectNumber = ID_BODY_PART; - fx->shade = 16912; - fx->flag2 = damage; - fx->frameNumber = obj->meshIndex + 2 * i; - - if (item->objectNumber == ID_CRUMBLING_FLOOR) - { - fx->speed = 0; - fx->fallspeed = 0; - fx->counter = 61; - } - else - { - fx->counter = 0; - } - fx->flag1 = 0; + + item->meshBits -= bit; } - - item->meshBits -= bits; } - }*/ + } - return (item->meshBits == 0); + return item->meshBits == 0; } int GetFreeShockwave()// (F) @@ -1617,9 +1583,9 @@ void TriggerExplosionBubble(int x, int y, int z, short roomNum)// (F) { GAME_VECTOR pos; - pos.x = item->pos.x_pos; - pos.y = item->pos.y_pos; - pos.z = item->pos.z_pos; + pos.x = item->pos.xPos; + pos.y = item->pos.yPos; + pos.z = item->pos.zPos; pos.roomNumber = item->roomNumber; SetUpLensFlare(0, 0, 0, &pos); diff --git a/TR5Main/Renderer/Render11Helper.cpp b/TR5Main/Renderer/Render11Helper.cpp index 9210570ed..3a69c0151 100644 --- a/TR5Main/Renderer/Render11Helper.cpp +++ b/TR5Main/Renderer/Render11Helper.cpp @@ -885,7 +885,17 @@ namespace T5M::Renderer void Renderer11::getBoneMatrix(short itemNumber, int joint, Matrix *outMatrix) { - RendererObject &obj = *m_moveableObjects[ID_LARA]; - *outMatrix = obj.AnimationTransforms[joint] * m_LaraWorldMatrix; + if (itemNumber == Lara.itemNumber) + { + RendererObject& obj = *m_moveableObjects[ID_LARA]; + *outMatrix = obj.AnimationTransforms[joint] * m_LaraWorldMatrix; + } + else + { + updateItemAnimations(itemNumber, true); + RendererItem& item = m_items[itemNumber]; + RendererObject& obj = *m_moveableObjects[item.Item->objectNumber]; + *outMatrix = obj.AnimationTransforms[joint] * item.World; + } } } // namespace T5M::Renderer From a752f49d5795d0a11a91104031ce1a3df2b6099e Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Sun, 9 Aug 2020 22:15:32 +0200 Subject: [PATCH 10/22] Using Smart Pointers --- TR5Main/Game/trmath.h | 26 ++-- .../Renderer/ConstantBuffer/ConstantBuffer.h | 1 + .../RenderPipelineState.cpp | 5 +- .../RenderTargetCubeArray.h | 3 +- TR5Main/Renderer/Renderer11.cpp | 33 ----- TR5Main/Renderer/Renderer11.h | 97 +++++-------- TR5Main/Renderer/Renderer11Compatibility.cpp | 28 ++-- TR5Main/Renderer/Renderer11Draw.cpp | 134 +++++++++--------- TR5Main/Renderer/Renderer11Draw2D.cpp | 30 ++-- TR5Main/Renderer/Renderer11DrawEffect.cpp | 56 ++++---- TR5Main/Renderer/Renderer11Init.cpp | 97 +++++++------ TR5Main/Renderer/Renderer11Lara.cpp | 18 +-- TR5Main/Renderer/Renderer11Settings.cpp | 4 - TR5Main/Renderer/Renderer11String.cpp | 4 +- TR5Main/Renderer/Utils.cpp | 31 ++-- TR5Main/Renderer/Utils.h | 16 ++- 16 files changed, 269 insertions(+), 314 deletions(-) diff --git a/TR5Main/Game/trmath.h b/TR5Main/Game/trmath.h index 783ccd090..69436b035 100644 --- a/TR5Main/Game/trmath.h +++ b/TR5Main/Game/trmath.h @@ -14,14 +14,24 @@ constexpr auto WALL_SIZE = 1024; constexpr auto STEPUP_HEIGHT = ((STEP_SIZE * 3) / 2); constexpr auto BAD_JUMP_CEILING = ((STEP_SIZE * 3) / 4); -#define SQUARE(x) ((x)*(x)) -#define CLAMP(x, a, b) ((x)<(a)?(a):((x)>(b)?(b):(x))) -#define SIGN(x) ((0 < (x)) - ((x) < 0)) -#define CLAMPADD(x, a, b) ((x)<(a)?((x)+(a)):((x)>(b)?((x)-(b)):0)) -#define CLICK(x) ((x) * STEP_SIZE) -#define SECTOR(x) ((x) * WALL_SIZE) -#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF)) - +template +constexpr auto SQUARE(T x) { return ((x)*(x)); } +template +constexpr auto CLAMP(T1 x, T2 a, T3 b) { return ((x)<(a)?(a):((x)>(b)?(b):(x))); } +template +constexpr auto SIGN(T x) { return ((0 < (x)) - ((x) < 0)); } +template +constexpr auto CLAMPADD(T1 x, T2 a, T3 b) { return ((x)<(a)?((x)+(a)):((x)>(b)?((x)-(b)):0)); } +template +constexpr auto CLICK(T x) { return ((x) * STEP_SIZE); } +template +constexpr auto SECTOR(T x) { return ((x) * WALL_SIZE); } +template +constexpr auto HIDWORD(T l) { return ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF)); } +template +constexpr auto MESH_BITS(T x) { + return (1 << x); +} short ANGLE(float angle); float TO_DEGREES(short angle); float TO_RAD(short angle); diff --git a/TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h b/TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h index 7841db687..042377d47 100644 --- a/TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h +++ b/TR5Main/Renderer/ConstantBuffer/ConstantBuffer.h @@ -16,6 +16,7 @@ namespace T5M::Renderer { desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; Utils::throwIfFailed(device->CreateBuffer(&desc, NULL, buffer.GetAddressOf())); + buffer->SetPrivateData(WKPDID_D3DDebugObjectName, 32, typeid(CBuff).name()); } ID3D11Buffer** get() { return buffer.GetAddressOf(); diff --git a/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp b/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp index 9e4d7cfe6..3f65030ab 100644 --- a/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp +++ b/TR5Main/Renderer/RenderPipelineState/RenderPipelineState.cpp @@ -5,8 +5,9 @@ namespace T5M::Renderer { using namespace Utils; RenderPipelineState::RenderPipelineState(ID3D11Device* device, const ShaderCompileOptions& vertexShader, const ShaderCompileOptions& pixelShader, const BlendStateOptions& blendingOptions) { - this->vertexShader = compileVertexShader(device, vertexShader.fileName.c_str(), vertexShader.functionName.c_str(), vertexShader.profile.c_str(),nullptr, nullptr); - this->pixelShader = compilePixelShader(device, pixelShader.fileName.c_str(), pixelShader.functionName.c_str(), pixelShader.profile.c_str(), nullptr, nullptr); + ComPtr blob; + this->vertexShader = compileVertexShader(device, vertexShader.fileName.c_str(), vertexShader.functionName.c_str(), vertexShader.profile.c_str(),nullptr, blob); + this->pixelShader = compilePixelShader(device, pixelShader.fileName.c_str(), pixelShader.functionName.c_str(), pixelShader.profile.c_str(), nullptr, blob); D3D11_BLEND_DESC blndDesc = {}; blndDesc.IndependentBlendEnable = blendingOptions.blendingEnabled; blndDesc.AlphaToCoverageEnable = false; diff --git a/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h index abed4c143..39e55e945 100644 --- a/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h +++ b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h @@ -15,8 +15,7 @@ namespace T5M::Renderer { static_cast(resolution), static_cast(resolution), 0, - 1, - + 1 }; } public: diff --git a/TR5Main/Renderer/Renderer11.cpp b/TR5Main/Renderer/Renderer11.cpp index 88fb4f45c..1ffc6bfa8 100644 --- a/TR5Main/Renderer/Renderer11.cpp +++ b/TR5Main/Renderer/Renderer11.cpp @@ -34,39 +34,6 @@ namespace T5M::Renderer { Renderer11::~Renderer11() { freeRendererData(); - - DX11_RELEASE(m_backBufferRTV); - DX11_RELEASE(m_backBufferTexture); - DX11_RELEASE(m_depthStencilState); - DX11_RELEASE(m_depthStencilTexture); - DX11_RELEASE(m_depthStencilView); - - DX11_DELETE(m_primitiveBatch); - DX11_DELETE(m_spriteBatch); - DX11_DELETE(m_gameFont); - DX11_DELETE(m_states); - - DX11_RELEASE(m_vsRooms); - DX11_RELEASE(m_psRooms); - DX11_RELEASE(m_vsItems); - DX11_RELEASE(m_psItems); - DX11_RELEASE(m_vsStatics); - DX11_RELEASE(m_psStatics); - DX11_RELEASE(m_vsHairs); - DX11_RELEASE(m_psHairs); - DX11_RELEASE(m_vsSky); - DX11_RELEASE(m_psSky); - DX11_RELEASE(m_vsSprites); - DX11_RELEASE(m_psSprites); - DX11_RELEASE(m_vsSolid); - DX11_RELEASE(m_psSolid); - DX11_RELEASE(m_vsInventory); - DX11_RELEASE(m_psInventory); - DX11_RELEASE(m_vsFullScreenQuad); - DX11_RELEASE(m_psFullScreenQuad); - DX11_RELEASE(m_swapChain); - DX11_RELEASE(m_context); - DX11_RELEASE(m_device); } void Renderer11::freeRendererData() diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index 6e8824eda..73ed2e313 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -20,20 +20,16 @@ #include "ConstantBuffers\SpriteBuffer.h" #include "RenderTargetCube\RenderTargetCube.h" #include "RenderView/RenderView.h" - -struct CAMERA_INFO; - #include #include "ConstantBuffer/ConstantBuffer.h" #include "RenderTargetCubeArray/RenderTargetCubeArray.h" - +struct CAMERA_INFO; +#include namespace T5M::Renderer { constexpr size_t MAX_DYNAMIC_SHADOWS = 1; using TexturePair = std::tuple; - #define MESH_BITS(x) (1 << x) - #define DX11_RELEASE(x) if (x != NULL) x->Release() - #define DX11_DELETE(x) if (x != NULL) { delete x; x = NULL; } + constexpr auto NUM_ANIMATED_SETS = 1024; constexpr auto MAX_LIGHTS_DRAW = 16384; constexpr auto MAX_DYNAMIC_LIGHTS = 16384; @@ -143,10 +139,6 @@ namespace T5M::Renderer float In; float Out; float Range; - - RendererLight() - { - } }; struct RendererAnimatedTexture @@ -355,13 +347,12 @@ namespace T5M::Renderer { private: // Core DX11 objects - ID3D11Device* m_device = nullptr; - ID3D11DeviceContext* m_context = nullptr; - IDXGISwapChain* m_swapChain = nullptr; - IDXGIDevice* m_dxgiDevice = nullptr; - CommonStates* m_states = nullptr; - ID3D11BlendState* m_subtractiveBlendState = nullptr; - ID3D11InputLayout* m_inputLayout = nullptr; + Microsoft::WRL::ComPtr m_device = nullptr; + Microsoft::WRL::ComPtr m_context = nullptr; + Microsoft::WRL::ComPtr m_swapChain = nullptr; + std::unique_ptr m_states = nullptr; + Microsoft::WRL::ComPtr m_subtractiveBlendState = nullptr; + Microsoft::WRL::ComPtr m_inputLayout = nullptr; D3D11_VIEWPORT m_viewport; D3D11_VIEWPORT m_shadowMapViewport; Viewport* m_viewportToolkit; @@ -381,37 +372,31 @@ namespace T5M::Renderer T5M::Renderer::RenderTarget2D m_shadowMap; T5M::Renderer::RenderTargetCube m_reflectionCubemap; // Shaders - ID3D11VertexShader* m_vsRooms; - ID3D11PixelShader* m_psRooms; - ID3D11VertexShader* m_vsItems; - ID3D11PixelShader* m_psItems; - ID3D11VertexShader* m_vsHairs; - ID3D11PixelShader* m_psHairs; - ID3D11VertexShader* m_vsStatics; - ID3D11PixelShader* m_psStatics; - ID3D11VertexShader* m_vsSky; - ID3D11PixelShader* m_psSky; - ID3D11VertexShader* m_vsSprites; - ID3D11PixelShader* m_psSprites; - ID3D11VertexShader* m_vsSolid; - ID3D11PixelShader* m_psSolid; - ID3D11VertexShader* m_vsInventory; - ID3D11PixelShader* m_psInventory; - ID3D11VertexShader* m_vsFullScreenQuad; - ID3D11PixelShader* m_psFullScreenQuad; - ID3D11VertexShader* m_vsShadowMap; - ID3D11PixelShader* m_psShadowMap; - ID3D11VertexShader* m_vsHUD; - ID3D11PixelShader* m_psHUDColor; - ID3D11PixelShader* m_psHUDTexture; - ID3D11PixelShader* m_psHUDBarColor; - - - ID3D11SamplerState* m_shadowSampler; - - ID3D11ShaderResourceView* m_shadowMapRV; - ID3D11Texture2D* m_shadowMapTexture; - ID3D11DepthStencilView* m_shadowMapDSV; + Microsoft::WRL::ComPtr m_vsRooms; + Microsoft::WRL::ComPtr m_psRooms; + Microsoft::WRL::ComPtr m_vsItems; + Microsoft::WRL::ComPtr m_psItems; + Microsoft::WRL::ComPtr m_vsHairs; + Microsoft::WRL::ComPtr m_psHairs; + Microsoft::WRL::ComPtr m_vsStatics; + Microsoft::WRL::ComPtr m_psStatics; + Microsoft::WRL::ComPtr m_vsSky; + Microsoft::WRL::ComPtr m_psSky; + Microsoft::WRL::ComPtr m_vsSprites; + Microsoft::WRL::ComPtr m_psSprites; + Microsoft::WRL::ComPtr m_vsSolid; + Microsoft::WRL::ComPtr m_psSolid; + Microsoft::WRL::ComPtr m_vsInventory; + Microsoft::WRL::ComPtr m_psInventory; + Microsoft::WRL::ComPtr m_vsFullScreenQuad; + Microsoft::WRL::ComPtr m_psFullScreenQuad; + Microsoft::WRL::ComPtr m_vsShadowMap; + Microsoft::WRL::ComPtr m_psShadowMap; + Microsoft::WRL::ComPtr m_vsHUD; + Microsoft::WRL::ComPtr m_psHUDColor; + Microsoft::WRL::ComPtr m_psHUDTexture; + Microsoft::WRL::ComPtr m_psHUDBarColor; + Microsoft::WRL::ComPtr m_shadowSampler; // Constant buffers @@ -436,12 +421,12 @@ namespace T5M::Renderer CSpriteBuffer m_stSprite; ConstantBuffer m_cbSprite; // Text and sprites - SpriteFont* m_gameFont; - SpriteBatch* m_spriteBatch; + std::unique_ptr m_gameFont; + std::unique_ptr m_spriteBatch; std::vector m_strings; int m_blinkColorValue; int m_blinkColorDirection; - PrimitiveBatch* m_primitiveBatch; + std::unique_ptr> m_primitiveBatch; // System resources T5M::Renderer::Texture2D m_HUDBarBorderTexture; @@ -624,12 +609,6 @@ namespace T5M::Renderer int ScreenHeight; bool Windowed; int NumTexturePages; - ID3D11Device* getDevice() const { - return m_device; - } - ID3D11DeviceContext* getContext() const { - return m_context; - }; Renderer11(); ~Renderer11(); @@ -685,7 +664,7 @@ namespace T5M::Renderer template ConstantBuffer createConstantBuffer() { - return ConstantBuffer(m_device); + return ConstantBuffer(m_device.Get()); } }; diff --git a/TR5Main/Renderer/Renderer11Compatibility.cpp b/TR5Main/Renderer/Renderer11Compatibility.cpp index 11863d8c7..9ec9cdc54 100644 --- a/TR5Main/Renderer/Renderer11Compatibility.cpp +++ b/TR5Main/Renderer/Renderer11Compatibility.cpp @@ -114,9 +114,9 @@ namespace T5M::Renderer if (texture->normalMapData.size() < 1) { normal = createDefaultNormalTexture(); } else { - normal = Texture2D(m_device, texture->normalMapData.data(), texture->normalMapData.size()); + normal = Texture2D(m_device.Get(), texture->normalMapData.data(), texture->normalMapData.size()); } - TexturePair tex =std::make_tuple(Texture2D(m_device, texture->colorMapData.data(), texture->colorMapData.size()), normal); + TexturePair tex =std::make_tuple(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size()), normal); m_roomTextures.push_back(tex); } @@ -127,9 +127,9 @@ namespace T5M::Renderer if (texture->normalMapData.size() < 1) { normal = createDefaultNormalTexture(); } else { - normal = Texture2D(m_device, texture->normalMapData.data(), texture->normalMapData.size()); + normal = Texture2D(m_device.Get(), texture->normalMapData.data(), texture->normalMapData.size()); } - TexturePair tex = std::make_tuple(Texture2D(m_device, texture->colorMapData.data(), texture->colorMapData.size()), normal); + TexturePair tex = std::make_tuple(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size()), normal); m_moveablesTextures.push_back(tex); } @@ -140,19 +140,19 @@ namespace T5M::Renderer if (texture->normalMapData.size() < 1) { normal = createDefaultNormalTexture(); } else { - normal = Texture2D(m_device, texture->normalMapData.data(), texture->normalMapData.size()); + normal = Texture2D(m_device.Get(), texture->normalMapData.data(), texture->normalMapData.size()); } - TexturePair tex = std::make_tuple(Texture2D(m_device, texture->colorMapData.data(), texture->colorMapData.size()), normal); + TexturePair tex = std::make_tuple(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size()), normal); m_staticsTextures.push_back(tex); } for (int i = 0; i < g_Level.SpritesTextures.size(); i++) { TEXTURE *texture = &g_Level.SpritesTextures[i]; - m_spritesTextures.push_back(Texture2D(m_device, texture->colorMapData.data(), texture->colorMapData.size())); + m_spritesTextures.push_back(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size())); } - m_skyTexture = Texture2D(m_device, g_Level.MiscTextures.colorMapData.data(), g_Level.MiscTextures.colorMapData.size()); + m_skyTexture = Texture2D(m_device.Get(), g_Level.MiscTextures.colorMapData.data(), g_Level.MiscTextures.colorMapData.size()); // Step 2: prepare rooms vector roomVertices; @@ -314,8 +314,8 @@ namespace T5M::Renderer // Create a single vertex buffer and a single index buffer for all rooms // NOTICE: in theory, a 1,000,000 vertices scene should have a VB of 52 MB and an IB of 4 MB - m_roomsVertexBuffer = VertexBuffer(m_device, roomVertices.size(), roomVertices.data()); - m_roomsIndexBuffer = IndexBuffer(m_device, roomIndices.size(), roomIndices.data()); + m_roomsVertexBuffer = VertexBuffer(m_device.Get(), roomVertices.size(), roomVertices.data()); + m_roomsIndexBuffer = IndexBuffer(m_device.Get(), roomIndices.size(), roomIndices.data()); m_numHairVertices = 0; m_numHairIndices = 0; @@ -644,8 +644,8 @@ namespace T5M::Renderer } // Create a single vertex buffer and a single index buffer for all moveables - m_moveablesVertexBuffer = VertexBuffer(m_device, moveablesVertices.size(), moveablesVertices.data()); - m_moveablesIndexBuffer = IndexBuffer(m_device, moveablesIndices.size(), moveablesIndices.data()); + m_moveablesVertexBuffer = VertexBuffer(m_device.Get(), moveablesVertices.size(), moveablesVertices.data()); + m_moveablesIndexBuffer = IndexBuffer(m_device.Get(), moveablesIndices.size(), moveablesIndices.data()); // Step 4: prepare static meshes vector staticsVertices; @@ -688,8 +688,8 @@ namespace T5M::Renderer } // Create a single vertex buffer and a single index buffer for all statics - m_staticsVertexBuffer = VertexBuffer(m_device, staticsVertices.size(), staticsVertices.data()); - m_staticsIndexBuffer = IndexBuffer(m_device, staticsIndices.size(), staticsIndices.data()); + m_staticsVertexBuffer = VertexBuffer(m_device.Get(), staticsVertices.size(), staticsVertices.data()); + m_staticsIndexBuffer = IndexBuffer(m_device.Get(), staticsIndices.size(), staticsIndices.data()); // Step 5: prepare sprites m_sprites.resize(g_Level.Sprites.size()); diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index 98e827e18..f8d14f3e1 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -76,12 +76,12 @@ namespace T5M::Renderer // Set vertex buffer m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set shaders - m_context->VSSetShader(m_vsInventory, NULL, 0); - m_context->PSSetShader(m_psInventory, NULL, 0); + m_context->VSSetShader(m_vsInventory.Get(), NULL, 0); + m_context->PSSetShader(m_psInventory.Get(), NULL, 0); // Set texture m_context->PSSetShaderResources(0, 1, (std::get<0>(m_moveablesTextures[0])).ShaderResourceView.GetAddressOf()); @@ -93,7 +93,7 @@ namespace T5M::Renderer // Set matrices CCameraMatrixBuffer HudCamera; HudCamera.ViewProjection = view * projection; - m_cbCameraMatrices.updateData(HudCamera, m_context); + m_cbCameraMatrices.updateData(HudCamera, m_context.Get()); m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); for (int n = 0; n < moveableObj.ObjectMeshes.size(); n++) @@ -113,7 +113,7 @@ namespace T5M::Renderer else m_stItem.World = (moveableObj.BindPoseTransforms[n] * world); m_stItem.AmbientLight = Vector4(0.5f, 0.5f, 0.5f, 1.0f); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); @@ -129,7 +129,7 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); m_stMisc.AlphaTest = (m < 2); - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); @@ -242,12 +242,12 @@ namespace T5M::Renderer UINT offset = 0; // Set shaders - m_context->VSSetShader(m_vsShadowMap, NULL, 0); - m_context->PSSetShader(m_psShadowMap, NULL, 0); + m_context->VSSetShader(m_vsShadowMap.Get(), NULL, 0); + m_context->PSSetShader(m_psShadowMap.Get(), NULL, 0); m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set texture @@ -265,13 +265,13 @@ namespace T5M::Renderer (m_shadowLight->Type == LIGHT_TYPE_POINT ? m_shadowLight->Out : m_shadowLight->Range) * 1.2f); CCameraMatrixBuffer shadowProjection; shadowProjection.ViewProjection = view * projection; - m_cbCameraMatrices.updateData(shadowProjection, m_context); + m_cbCameraMatrices.updateData(shadowProjection, m_context.Get()); m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); m_stShadowMap.LightViewProjection = (view * projection); m_stMisc.AlphaTest = true; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); RendererObject &laraObj = *m_moveableObjects[ID_LARA]; @@ -282,7 +282,7 @@ namespace T5M::Renderer m_stItem.Position = Vector4(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; memcpy(m_stItem.BonesMatrices, laraObj.AnimationTransforms.data(), sizeof(Matrix) * 32); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); @@ -357,7 +357,7 @@ namespace T5M::Renderer matrices[i + 1] = world; } memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 7); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); @@ -386,7 +386,7 @@ namespace T5M::Renderer std::mbstowcs(introFileChars, g_GameFlow->Intro, 255); std::wstring titleStringFileName(introFileChars); - Texture2D texture = Texture2D(m_device, titleStringFileName); + Texture2D texture = Texture2D(m_device.Get(), titleStringFileName); float currentFade = 0; while (currentFade <= 1.0f) @@ -425,11 +425,11 @@ namespace T5M::Renderer m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = true; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int i = 0; i < 24; i++) @@ -446,7 +446,7 @@ namespace T5M::Renderer Matrix world = rotation * translation; m_stItem.World = world; - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); RendererMesh *mesh = moveableObj.ObjectMeshes[0]; @@ -511,12 +511,12 @@ namespace T5M::Renderer // Set vertex buffer m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set shaders - m_context->VSSetShader(m_vsInventory, NULL, 0); - m_context->PSSetShader(m_psInventory, NULL, 0); + m_context->VSSetShader(m_vsInventory.Get(), NULL, 0); + m_context->PSSetShader(m_psInventory.Get(), NULL, 0); // Set texture m_context->PSSetShaderResources(0, 1, (std::get<0>(m_moveablesTextures[0])).ShaderResourceView.GetAddressOf()); @@ -537,7 +537,7 @@ namespace T5M::Renderer Matrix::CreatePerspectiveFieldOfView(80.0f * RADIAN, g_Renderer.ScreenWidth / (float)g_Renderer.ScreenHeight, 1.0f, 200000.0f); - m_cbCameraMatrices.updateData(inventoryCam, m_context); + m_cbCameraMatrices.updateData(inventoryCam, m_context.Get()); m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); for (int k = 0; k < NUM_INVENTORY_RINGS; k++) @@ -634,7 +634,7 @@ namespace T5M::Renderer else m_stItem.World = (moveableObj.BindPoseTransforms[n] * transform); m_stItem.AmbientLight = Vector4(0.5f, 0.5f, 0.5f, 1.0f); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); @@ -650,7 +650,7 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); m_stMisc.AlphaTest = (m < 2); - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); @@ -1218,15 +1218,15 @@ namespace T5M::Renderer vertices[3].Color = Vector4(color.x, color.y, color.z, 1.0f); } - m_context->VSSetShader(m_vsFullScreenQuad, NULL, 0); - m_context->PSSetShader(m_psFullScreenQuad, NULL, 0); + m_context->VSSetShader(m_vsFullScreenQuad.Get(), NULL, 0); + m_context->PSSetShader(m_psFullScreenQuad.Get(), NULL, 0); m_context->PSSetShaderResources(0, 1, &texture); ID3D11SamplerState *sampler = m_states->AnisotropicClamp(); m_context->PSSetSamplers(0, 1, &sampler); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_primitiveBatch->Begin(); m_primitiveBatch->DrawQuad(vertices[0], vertices[1], vertices[2], vertices[3]); @@ -1358,12 +1358,12 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthRead(), 0); - m_context->VSSetShader(m_vsSolid, NULL, 0); - m_context->PSSetShader(m_psSolid, NULL, 0); + m_context->VSSetShader(m_vsSolid.Get(), NULL, 0); + m_context->PSSetShader(m_psSolid.Get(), NULL, 0); Matrix world = Matrix::CreateOrthographicOffCenter(0, ScreenWidth, ScreenHeight, 0, m_viewport.MinDepth, m_viewport.MaxDepth); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_primitiveBatch->Begin(); @@ -1479,7 +1479,7 @@ namespace T5M::Renderer m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); if (Objects[ID_RATS_EMITTER].loaded) @@ -1504,7 +1504,7 @@ namespace T5M::Renderer m_stItem.World = world; m_stItem.Position = Vector4(rat->pos.xPos, rat->pos.yPos, rat->pos.zPos, 1.0f); m_stItem.AmbientLight = m_rooms[rat->roomNumber].AmbientLight; - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); for (int b = 0; b < 2; b++) { @@ -1529,7 +1529,7 @@ namespace T5M::Renderer m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); if (Objects[ID_BATS_EMITTER].loaded) @@ -1561,7 +1561,7 @@ namespace T5M::Renderer m_stItem.World = world; m_stItem.Position = Vector4(bat->pos.xPos, bat->pos.yPos, bat->pos.zPos, 1.0f); m_stItem.AmbientLight = m_rooms[bat->roomNumber].AmbientLight; - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0); m_numDrawCalls++; @@ -1579,7 +1579,7 @@ namespace T5M::Renderer m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); if (Objects[ID_LITTLE_BEETLE].loaded) @@ -1604,7 +1604,7 @@ namespace T5M::Renderer m_stItem.World = world; m_stItem.Position = Vector4(beetle->pos.xPos, beetle->pos.yPos, beetle->pos.zPos, 1.0f); m_stItem.AmbientLight = m_rooms[beetle->roomNumber].AmbientLight; - m_cbItem.updateData(m_stItem,m_context); + m_cbItem.updateData(m_stItem,m_context.Get()); for (int b = 0; b < 2; b++) { @@ -1759,11 +1759,11 @@ namespace T5M::Renderer m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthRead(), 0); - m_context->VSSetShader(m_vsSolid, NULL, 0); - m_context->PSSetShader(m_psSolid, NULL, 0); + m_context->VSSetShader(m_vsSolid.Get(), NULL, 0); + m_context->PSSetShader(m_psSolid.Get(), NULL, 0); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_primitiveBatch->Begin(); @@ -1974,7 +1974,7 @@ namespace T5M::Renderer view.fillConstantBuffer(cameraConstantBuffer); cameraConstantBuffer.Frame = GnFrameCounter; cameraConstantBuffer.CameraUnderwater = g_Level.Rooms[cameraConstantBuffer.RoomNumber].flags & ENV_FLAG_WATER; - m_cbCameraMatrices.updateData(cameraConstantBuffer, m_context); + m_cbCameraMatrices.updateData(cameraConstantBuffer, m_context.Get()); m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); drawHorizonAndSky(depthTarget); drawRooms(false, false, view); @@ -2126,7 +2126,7 @@ namespace T5M::Renderer view.fillConstantBuffer(cameraConstantBuffer); cameraConstantBuffer.Frame = GnFrameCounter; cameraConstantBuffer.CameraUnderwater = g_Level.Rooms[cameraConstantBuffer.RoomNumber].flags & ENV_FLAG_WATER; - m_cbCameraMatrices.updateData(cameraConstantBuffer, m_context); + m_cbCameraMatrices.updateData(cameraConstantBuffer, m_context.Get()); m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices.get()); drawHorizonAndSky(depthTarget); drawRooms(false, false, view); @@ -2147,14 +2147,14 @@ namespace T5M::Renderer m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); RendererItem *item = &m_items[Lara.itemNumber]; // Set shaders - m_context->VSSetShader(m_vsItems, NULL, 0); - m_context->PSSetShader(m_psItems, NULL, 0); + m_context->VSSetShader(m_vsItems.Get(), NULL, 0); + m_context->PSSetShader(m_psItems.Get(), NULL, 0); // Set texture m_context->PSSetShaderResources(0, 1, (std::get<0>(m_moveablesTextures[0])).ShaderResourceView.GetAddressOf()); @@ -2164,7 +2164,7 @@ namespace T5M::Renderer m_context->PSSetSamplers(0, 1, &sampler); m_stMisc.AlphaTest = !transparent; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int i = 0; i < view.itemsToDraw.size(); i++) @@ -2221,18 +2221,18 @@ namespace T5M::Renderer m_stItem.Position = Vector4(item->Item->pos.xPos, item->Item->pos.yPos, item->Item->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; memcpy(m_stItem.BonesMatrices, item->AnimationTransforms, sizeof(Matrix) * 32); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = !transparent; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int k = 0; k < moveableObj.ObjectMeshes.size(); k++) @@ -2344,12 +2344,12 @@ namespace T5M::Renderer m_context->IASetVertexBuffers(0, 1, m_staticsVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_staticsIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set shaders - m_context->VSSetShader(m_vsStatics, NULL, 0); - m_context->PSSetShader(m_psStatics, NULL, 0); + m_context->VSSetShader(m_vsStatics.Get(), NULL, 0); + m_context->PSSetShader(m_psStatics.Get(), NULL, 0); // Set texture m_context->PSSetShaderResources(0, 1, (std::get<0>(m_staticsTextures[0])).ShaderResourceView.GetAddressOf()); @@ -2374,7 +2374,7 @@ namespace T5M::Renderer m_stStatic.World = (Matrix::CreateRotationY(TO_RAD(msh->yRot)) * Matrix::CreateTranslation(msh->x, msh->y, msh->z)); m_stStatic.Color = Vector4(((msh->shade >> 10) & 0xFF) / 255.0f, ((msh->shade >> 5) & 0xFF) / 255.0f, ((msh->shade >> 0) & 0xFF) / 255.0f, 1.0f); - m_cbStatic.updateData(m_stStatic, m_context); + m_cbStatic.updateData(m_stStatic, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); for (int j = firstBucket; j < lastBucket; j++) @@ -2405,13 +2405,13 @@ namespace T5M::Renderer // Set vertex buffer m_context->IASetVertexBuffers(0, 1, m_roomsVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_roomsIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); } // Set shaders - m_context->VSSetShader(m_vsRooms, NULL, 0); - m_context->PSSetShader(m_psRooms, NULL, 0); + m_context->VSSetShader(m_vsRooms.Get(), NULL, 0); + m_context->PSSetShader(m_psRooms.Get(), NULL, 0); // Set texture m_context->PSSetShaderResources(0, 1, (std::get<0>(m_roomTextures[0])).ShaderResourceView.GetAddressOf()); @@ -2419,7 +2419,7 @@ namespace T5M::Renderer ID3D11SamplerState *sampler = m_states->AnisotropicWrap(); m_context->PSSetSamplers(0, 1, &sampler); m_context->PSSetShaderResources(1, 1, m_caustics[m_currentCausticsFrame / 2].ShaderResourceView.GetAddressOf()); - m_context->PSSetSamplers(1, 1, &m_shadowSampler); + m_context->PSSetSamplers(1, 1, m_shadowSampler.GetAddressOf()); m_context->PSSetShaderResources(2, 1, m_shadowMap.ShaderResourceView.GetAddressOf()); // Set shadow map data @@ -2434,7 +2434,7 @@ namespace T5M::Renderer { m_stShadowMap.CastShadows = false; } - m_cbShadowMap.updateData(m_stShadowMap, m_context); + m_cbShadowMap.updateData(m_stShadowMap, m_context.Get()); m_context->VSSetConstantBuffers(4, 1, m_cbShadowMap.get()); m_context->PSSetConstantBuffers(4, 1, m_cbShadowMap.get()); @@ -2448,16 +2448,16 @@ namespace T5M::Renderer m_stLights.NumLights = view.lightsToDraw.size(); for (int j = 0; j < view.lightsToDraw.size(); j++) memcpy(&m_stLights.Lights[j], view.lightsToDraw[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(1, 1, m_cbLights.get()); m_stMisc.Caustics = (room->Room->flags & ENV_FLAG_WATER); m_stMisc.AlphaTest = !transparent; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_stRoom.AmbientColor = room->AmbientLight; m_stRoom.water = (room->Room->flags & ENV_FLAG_WATER) != 0 ? 1 : 0; - m_cbRoom.updateData(m_stRoom, m_context); + m_cbRoom.updateData(m_stRoom, m_context.Get()); m_context->VSSetConstantBuffers(5, 1, m_cbRoom.get()); m_context->PSSetConstantBuffers(5, 1, m_cbRoom.get()); for (int j = firstBucket; j < lastBucket; j++) @@ -2584,11 +2584,11 @@ namespace T5M::Renderer vertices[3].Color.z = 1.0f; vertices[3].Color.w = 1.0f; - m_context->VSSetShader(m_vsSky, NULL, 0); - m_context->PSSetShader(m_psSky, NULL, 0); + m_context->VSSetShader(m_vsSky.Get(), NULL, 0); + m_context->PSSetShader(m_psSky.Get(), NULL, 0); m_stMisc.AlphaTest = true; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->PSSetShaderResources(0, 1, m_skyTexture.ShaderResourceView.GetAddressOf()); @@ -2596,7 +2596,7 @@ namespace T5M::Renderer m_context->PSSetSamplers(0, 1, &sampler); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); for (int i = 0; i < 2; i++) { @@ -2605,7 +2605,7 @@ namespace T5M::Renderer m_stStatic.World = (rotation * translation); m_stStatic.Color = color; - m_cbStatic.updateData(m_stStatic, m_context); + m_cbStatic.updateData(m_stStatic, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); m_context->PSSetConstantBuffers(1, 1, m_cbStatic.get()); @@ -2619,7 +2619,7 @@ namespace T5M::Renderer { m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); m_context->PSSetShaderResources(0, 1, (std::get<0>(m_moveablesTextures[0])).ShaderResourceView.GetAddressOf()); @@ -2632,12 +2632,12 @@ namespace T5M::Renderer m_stStatic.World = Matrix::CreateTranslation(Camera.pos.x, Camera.pos.y, Camera.pos.z); m_stStatic.Position = Vector4::Zero; m_stStatic.Color = Vector4::One; - m_cbStatic.updateData(m_stStatic, m_context); + m_cbStatic.updateData(m_stStatic, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); m_context->PSSetConstantBuffers(1, 1, m_cbStatic.get()); m_stMisc.AlphaTest = true; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); for (int k = 0; k < moveableObj.ObjectMeshes.size(); k++) diff --git a/TR5Main/Renderer/Renderer11Draw2D.cpp b/TR5Main/Renderer/Renderer11Draw2D.cpp index 6dcd95ade..8aa0f9757 100644 --- a/TR5Main/Renderer/Renderer11Draw2D.cpp +++ b/TR5Main/Renderer/Renderer11Draw2D.cpp @@ -69,27 +69,27 @@ namespace T5M::Renderer { Vector4(0.18f,0.3f,0.72f,1), Vector4(0.18f,0.3f,0.72f,1), }; - g_HealthBar = new RendererHUDBar(m_device, 20, 32, 150, 8, 1, healthColors); - g_AirBar = new RendererHUDBar(m_device, 630, 32, 150, 8, 1, airColors); - g_DashBar = new RendererHUDBar(m_device, 630, 32 + 8 + 4, 150, 8, 1, dashColors); - g_MusicVolumeBar = new RendererHUDBar(m_device, 400, 212, 150, 8, 1, soundSettingColors); - g_SFXVolumeBar = new RendererHUDBar(m_device, 400, 230, 150, 8, 1, soundSettingColors); + g_HealthBar = new RendererHUDBar(m_device.Get(), 20, 32, 150, 8, 1, healthColors); + g_AirBar = new RendererHUDBar(m_device.Get(), 630, 32, 150, 8, 1, airColors); + g_DashBar = new RendererHUDBar(m_device.Get(), 630, 32 + 8 + 4, 150, 8, 1, dashColors); + g_MusicVolumeBar = new RendererHUDBar(m_device.Get(), 400, 212, 150, 8, 1, soundSettingColors); + g_SFXVolumeBar = new RendererHUDBar(m_device.Get(), 400, 230, 150, 8, 1, soundSettingColors); } void Renderer11::drawBar(float percent, const RendererHUDBar* const bar) { UINT strides = sizeof(RendererVertex); UINT offset = 0; float color[] = { 0,0,0,1.0f }; m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.0f, 0xFF); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetVertexBuffers(0, 1, bar->vertexBufferBorder.Buffer.GetAddressOf(), &strides, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetIndexBuffer(bar->indexBufferBorder.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); m_context->VSSetConstantBuffers(0, 1, m_cbHUD.get()); - m_context->VSSetShader(m_vsHUD, NULL, 0); + m_context->VSSetShader(m_vsHUD.Get(), NULL, 0); m_context->PSSetShaderResources(0, 1, m_HUDBarBorderTexture.ShaderResourceView.GetAddressOf()); ID3D11SamplerState* sampler = m_states->LinearClamp(); m_context->PSSetSamplers(0, 1, &sampler); - m_context->PSSetShader(m_psHUDTexture, NULL, 0); + m_context->PSSetShader(m_psHUDTexture.Get(), NULL, 0); m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthNone(), NULL); m_context->RSSetState(m_states->CullNone()); @@ -97,16 +97,16 @@ namespace T5M::Renderer { m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.0f, 0xFF); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetVertexBuffers(0, 1, bar->vertexBuffer.Buffer.GetAddressOf(), &strides, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetIndexBuffer(bar->indexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); m_stHUDBar.Percent = percent; - m_cbHUDBar.updateData(m_stHUDBar, m_context); + m_cbHUDBar.updateData(m_stHUDBar, m_context.Get()); m_context->VSSetConstantBuffers(0, 1, m_cbHUD.get()); m_context->PSSetConstantBuffers(0, 1, m_cbHUDBar.get()); - m_context->VSSetShader(m_vsHUD, NULL, 0); - m_context->PSSetShader(m_psHUDBarColor, NULL, 0); + m_context->VSSetShader(m_vsHUD.Get(), NULL, 0); + m_context->PSSetShader(m_psHUDBarColor.Get(), NULL, 0); m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); m_context->OMSetDepthStencilState(m_states->DepthNone(), NULL); m_context->RSSetState(m_states->CullNone()); @@ -164,11 +164,11 @@ namespace T5M::Renderer { vertices[3].UV.y = 1.0f; vertices[3].Color = Vector4(1.0f, 0.0f, 0.0f, 1.0f); - m_context->VSSetShader(m_vsFullScreenQuad, NULL, 0); - m_context->PSSetShader(m_psFullScreenQuad, NULL, 0); + m_context->VSSetShader(m_vsFullScreenQuad.Get(), NULL, 0); + m_context->PSSetShader(m_psFullScreenQuad.Get(), NULL, 0); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_primitiveBatch->Begin(); m_primitiveBatch->DrawQuad(vertices[0], vertices[1], vertices[2], vertices[3]); diff --git a/TR5Main/Renderer/Renderer11DrawEffect.cpp b/TR5Main/Renderer/Renderer11DrawEffect.cpp index 2c860f45b..52aa3be2e 100644 --- a/TR5Main/Renderer/Renderer11DrawEffect.cpp +++ b/TR5Main/Renderer/Renderer11DrawEffect.cpp @@ -501,11 +501,11 @@ namespace T5M::Renderer { m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = true; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); short length = 0; @@ -556,7 +556,7 @@ namespace T5M::Renderer { world = rotation2 * world; m_stItem.World = world; - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->DrawIndexed(flashBucket->Indices.size(), flashBucket->StartIndex, 0); @@ -569,7 +569,7 @@ namespace T5M::Renderer { world = rotation2 * world; m_stItem.World = world; - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->DrawIndexed(flashBucket->Indices.size(), flashBucket->StartIndex, 0); @@ -609,11 +609,11 @@ namespace T5M::Renderer { m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = true; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); @@ -645,7 +645,7 @@ namespace T5M::Renderer { world = rotationZ * world; m_stItem.World = world; - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->DrawIndexed(flashBucket->Indices.size(), flashBucket->StartIndex, 0); @@ -662,7 +662,7 @@ namespace T5M::Renderer { Texture2D Renderer11::createDefaultNormalTexture() { vector data = {128,128,255,1}; - return Texture2D(m_device,1,1,data.data()); + return Texture2D(m_device.Get(),1,1,data.data()); } void Renderer11::drawFootprints() { @@ -741,15 +741,15 @@ namespace T5M::Renderer { m_context->RSSetState(m_states->CullNone()); m_context->OMSetDepthStencilState(m_states->DepthRead(), 0); - m_context->VSSetShader(m_vsSprites, NULL, 0); - m_context->PSSetShader(m_psSprites, NULL, 0); + m_context->VSSetShader(m_vsSprites.Get(), NULL, 0); + m_context->PSSetShader(m_psSprites.Get(), NULL, 0); m_stMisc.AlphaTest = true; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetVertexBuffers(0, 1, quadVertexBuffer.GetAddressOf(), &stride, &offset); for (int b = 0; b < 4; b++) { BLEND_MODES currentBlendMode = (BLEND_MODES)b; @@ -769,7 +769,7 @@ namespace T5M::Renderer { m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); break; case BLENDMODE_SUBTRACTIVE: - m_context->OMSetBlendState(m_subtractiveBlendState, NULL, 0xFFFFFFFF); + m_context->OMSetBlendState(m_subtractiveBlendState.Get(), NULL, 0xFFFFFFFF); break; } @@ -793,7 +793,7 @@ namespace T5M::Renderer { m_stSprite.billboardMatrix = billboardMatrix; m_stSprite.color = spr->color; m_stSprite.isBillboard = true; - m_cbSprite.updateData(m_stSprite, m_context); + m_cbSprite.updateData(m_stSprite, m_context.Get()); m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_context->Draw(4, 0); } else if (spr->Type == RENDERER_SPRITE_TYPE::SPRITE_TYPE_BILLBOARD_CUSTOM) { @@ -809,7 +809,7 @@ namespace T5M::Renderer { m_stSprite.billboardMatrix = billboardMatrix; m_stSprite.color = spr->color; m_stSprite.isBillboard = true; - m_cbSprite.updateData(m_stSprite, m_context); + m_cbSprite.updateData(m_stSprite, m_context.Get()); m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_context->Draw(4, 0); } else if (spr->Type == RENDERER_SPRITE_TYPE::SPRITE_TYPE_BILLBOARD_LOOKAT) { @@ -820,7 +820,7 @@ namespace T5M::Renderer { m_stSprite.billboardMatrix = billboardMatrix; m_stSprite.color = spr->color; m_stSprite.isBillboard = true; - m_cbSprite.updateData(m_stSprite, m_context); + m_cbSprite.updateData(m_stSprite, m_context.Get()); m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_context->Draw(4, 0); }else if (spr->Type == RENDERER_SPRITE_TYPE::SPRITE_TYPE_3D) { @@ -863,7 +863,7 @@ namespace T5M::Renderer { v3.Color = spr->color; m_stSprite.color = spr->color; m_stSprite.isBillboard = false; - m_cbSprite.updateData(m_stSprite, m_context); + m_cbSprite.updateData(m_stSprite, m_context.Get()); m_context->VSSetConstantBuffers(4, 1, m_cbSprite.get()); m_primitiveBatch->DrawQuad(v0, v1, v2, v3); m_primitiveBatch->End(); @@ -893,17 +893,17 @@ namespace T5M::Renderer { m_stItem.AmbientLight = room.AmbientLight; Matrix matrices[1] = { Matrix::Identity }; memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix)); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_stLights.NumLights = effect->Lights.size(); for (int j = 0; j < effect->Lights.size(); j++) memcpy(&m_stLights.Lights[j], effect->Lights[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = !transparent; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); RendererMesh* mesh = effect->Mesh; @@ -930,7 +930,7 @@ namespace T5M::Renderer { m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); for (int i = 0; i < m_effectsToDraw.size(); i++) { @@ -966,17 +966,17 @@ namespace T5M::Renderer { m_stItem.Position = Vector4(item->Item->pos.xPos, item->Item->pos.yPos, item->Item->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; //Vector4::One * 0.1f; // room->AmbientLight; memcpy(m_stItem.BonesMatrices, item->AnimationTransforms, sizeof(Matrix) * 32); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); m_stMisc.AlphaTest = false; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_primitiveBatch->Begin(); @@ -1139,8 +1139,8 @@ namespace T5M::Renderer { Matrix rotation = Matrix::CreateFromQuaternion(deb->rotation); Matrix world = rotation * translation; m_primitiveBatch->Begin(); - m_context->VSSetShader(m_vsStatics, NULL, 0); - m_context->PSSetShader(m_psStatics, NULL, 0); + m_context->VSSetShader(m_vsStatics.Get(), NULL, 0); + m_context->PSSetShader(m_psStatics.Get(), NULL, 0); m_context->PSSetShaderResources(0, 1, (std::get<0>(m_staticsTextures[0])).ShaderResourceView.GetAddressOf()); ID3D11SamplerState* sampler = m_states->AnisotropicClamp(); m_context->PSSetSamplers(0, 1, &sampler); @@ -1149,11 +1149,11 @@ namespace T5M::Renderer { //updateConstantBuffer(m_cbCameraMatrices, &m_stCameraMatrices, sizeof(CCameraMatrixBuffer)); //m_context->VSSetConstantBuffers(0, 1, m_cbCameraMatrices); m_stMisc.AlphaTest = !transparent; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_stStatic.World = world; m_stStatic.Color = Vector4::One; - m_cbStatic.updateData(m_stStatic, m_context); + m_cbStatic.updateData(m_stStatic, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbStatic.get()); RendererVertex vtx0 = deb->mesh.vertices[0]; RendererVertex vtx1 = deb->mesh.vertices[1]; diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 7956250c8..6bd99368f 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -5,6 +5,7 @@ #include "GameFlowScript.h" #include "Quad/RenderQuad.h" #include +#include using namespace T5M::Renderer; using std::vector; extern GameConfiguration g_Configuration; @@ -15,7 +16,7 @@ void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool w HRESULT res; //DB_Log(2, "Renderer::Initialise - DLL"); - printf("Initialising DX11\n"); + logD("Initializing DX11"); CoInitialize(NULL); @@ -25,7 +26,7 @@ void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool w initialiseScreen(w, h, refreshRate, windowed, handle, false); // Initialise render states - m_states = new CommonStates(m_device); + m_states = std::make_unique(m_device.Get()); // Load caustics const char* causticsNames[NUM_CAUSTICS_TEXTURES] = { @@ -52,27 +53,27 @@ void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool w wchar_t causticsFile[255]; std::mbstowcs(causticsFile, causticsNames[i], 255); std::wstring causticsFilename = std::wstring(causticsFile); - m_caustics[i] = Texture2D(m_device, causticsFilename); + m_caustics[i] = Texture2D(m_device.Get(), causticsFilename); } - m_HUDBarBorderTexture = Texture2D(m_device, L"bar_border.png"); + m_HUDBarBorderTexture = Texture2D(m_device.Get(), L"bar_border.png"); wchar_t titleScreenFile[255]; std::wstring titleFile = std::wstring(titleScreenFile); std::mbstowcs(titleScreenFile, g_GameFlow->GetLevel(0)->Background.c_str(),255); - m_titleScreen = Texture2D(m_device, titleScreenFile); + m_titleScreen = Texture2D(m_device.Get(), titleScreenFile); - m_binocularsTexture = Texture2D(m_device, L"Binoculars.png"); - m_whiteTexture = Texture2D(m_device, L"WhiteSprite.png"); + m_binocularsTexture = Texture2D(m_device.Get(), L"Binoculars.png"); + m_whiteTexture = Texture2D(m_device.Get(), L"WhiteSprite.png"); - m_logo = Texture2D(m_device, L"Logo.png"); - m_shadowMaps = RenderTargetCubeArray(m_device, g_Configuration.shadowMapSize, MAX_DYNAMIC_SHADOWS, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_D16_UNORM); + m_logo = Texture2D(m_device.Get(), L"Logo.png"); + m_shadowMaps = RenderTargetCubeArray(m_device.Get(), g_Configuration.shadowMapSize, MAX_DYNAMIC_SHADOWS, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_D16_UNORM); // Load shaders - ID3D10Blob * blob; + ComPtr blob; //char shadowMapStringBuff[4]; //_itoa(g_Configuration.shadowMapSize, shadowMapStringBuff,10); std::string shadowSizeString = std::to_string(g_Configuration.shadowMapSize); const D3D_SHADER_MACRO roomDefines[] = {"SHADOW_MAP_SIZE",shadowSizeString.c_str(),nullptr,nullptr}; - m_vsRooms = Utils::compileVertexShader(m_device,L"Shaders\\DX11_Rooms.fx", "VS", "vs_4_0", &roomDefines[0], &blob); + m_vsRooms = Utils::compileVertexShader(m_device.Get(),L"Shaders\\DX11_Rooms.fx", "VS", "vs_4_0", &roomDefines[0], blob); // Initialise input layout using the first vertex shader D3D11_INPUT_ELEMENT_DESC inputLayout[] = @@ -85,34 +86,32 @@ void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool w {"BITANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 60, D3D11_INPUT_PER_VERTEX_DATA, 0}, {"BLENDINDICES", 0, DXGI_FORMAT_R32_FLOAT, 0, 72, D3D11_INPUT_PER_VERTEX_DATA, 0} }; - - m_inputLayout = NULL; Utils::throwIfFailed(m_device->CreateInputLayout(inputLayout, 7, blob->GetBufferPointer(), blob->GetBufferSize(), &m_inputLayout)); - m_psRooms = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Rooms.fx", "PS", "ps_4_0", &roomDefines[0], &blob); - m_vsItems = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Items.fx", "VS", "vs_4_0", nullptr, &blob); - m_psItems = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Items.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsStatics = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Statics.fx", "VS", "vs_4_0", nullptr, &blob); - m_psStatics = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Statics.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsHairs = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Hairs.fx", "VS", "vs_4_0", nullptr, &blob); - m_psHairs = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Hairs.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsSky = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Sky.fx", "VS", "vs_4_0", nullptr, &blob); - m_psSky = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Sky.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsSprites = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Sprites.fx", "VS", "vs_4_0", nullptr, &blob); - m_psSprites = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Sprites.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsSolid = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Solid.fx", "VS", "vs_4_0", nullptr, &blob); - m_psSolid = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Solid.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsInventory = Utils::compileVertexShader(m_device, L"Shaders\\DX11_Inventory.fx", "VS", "vs_4_0",nullptr, &blob); - m_psInventory = Utils::compilePixelShader(m_device, L"Shaders\\DX11_Inventory.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsFullScreenQuad = Utils::compileVertexShader(m_device, L"Shaders\\DX11_FullScreenQuad.fx", "VS", "vs_4_0",nullptr, &blob); - m_psFullScreenQuad = Utils::compilePixelShader(m_device, L"Shaders\\DX11_FullScreenQuad.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsShadowMap = Utils::compileVertexShader(m_device, L"Shaders\\DX11_ShadowMap.fx", "VS", "vs_4_0", nullptr, &blob); - m_psShadowMap = Utils::compilePixelShader(m_device, L"Shaders\\DX11_ShadowMap.fx", "PS", "ps_4_0", nullptr, &blob); - m_vsHUD = Utils::compileVertexShader(m_device, L"Shaders\\HUD\\DX11_VS_HUD.hlsl", "VS", "vs_4_0", nullptr, &blob); - m_psHUDColor = Utils::compilePixelShader(m_device, L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSColored", "ps_4_0", nullptr, &blob); - m_psHUDTexture = Utils::compilePixelShader(m_device,L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSTextured", "ps_4_0", nullptr, &blob); - m_psHUDBarColor = Utils::compilePixelShader(m_device,L"Shaders\\HUD\\DX11_PS_HUDBar.hlsl", "PSColored", "ps_4_0", nullptr, &blob); - m_shadowMap = RenderTarget2D(m_device, g_Configuration.shadowMapSize, g_Configuration.shadowMapSize, DXGI_FORMAT_R32_FLOAT,DXGI_FORMAT_D16_UNORM); + m_psRooms = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Rooms.fx", "PS", "ps_4_0", &roomDefines[0], blob); + m_vsItems = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_Items.fx", "VS", "vs_4_0", nullptr, blob); + m_psItems = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Items.fx", "PS", "ps_4_0", nullptr, blob); + m_vsStatics = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_Statics.fx", "VS", "vs_4_0", nullptr, blob); + m_psStatics = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Statics.fx", "PS", "ps_4_0", nullptr, blob); + m_vsHairs = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_Hairs.fx", "VS", "vs_4_0", nullptr, blob); + m_psHairs = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Hairs.fx", "PS", "ps_4_0", nullptr, blob); + m_vsSky = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_Sky.fx", "VS", "vs_4_0", nullptr, blob); + m_psSky = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Sky.fx", "PS", "ps_4_0", nullptr, blob); + m_vsSprites = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_Sprites.fx", "VS", "vs_4_0", nullptr, blob); + m_psSprites = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Sprites.fx", "PS", "ps_4_0", nullptr, blob); + m_vsSolid = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_Solid.fx", "VS", "vs_4_0", nullptr, blob); + m_psSolid = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Solid.fx", "PS", "ps_4_0", nullptr, blob); + m_vsInventory = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_Inventory.fx", "VS", "vs_4_0",nullptr, blob); + m_psInventory = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_Inventory.fx", "PS", "ps_4_0", nullptr, blob); + m_vsFullScreenQuad = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_FullScreenQuad.fx", "VS", "vs_4_0",nullptr, blob); + m_psFullScreenQuad = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_FullScreenQuad.fx", "PS", "ps_4_0", nullptr, blob); + m_vsShadowMap = Utils::compileVertexShader(m_device.Get(), L"Shaders\\DX11_ShadowMap.fx", "VS", "vs_4_0", nullptr, blob); + m_psShadowMap = Utils::compilePixelShader(m_device.Get(), L"Shaders\\DX11_ShadowMap.fx", "PS", "ps_4_0", nullptr, blob); + m_vsHUD = Utils::compileVertexShader(m_device.Get(), L"Shaders\\HUD\\DX11_VS_HUD.hlsl", "VS", "vs_4_0", nullptr, blob); + m_psHUDColor = Utils::compilePixelShader(m_device.Get(), L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSColored", "ps_4_0", nullptr, blob); + m_psHUDTexture = Utils::compilePixelShader(m_device.Get(),L"Shaders\\HUD\\DX11_PS_HUD.hlsl", "PSTextured", "ps_4_0", nullptr, blob); + m_psHUDBarColor = Utils::compilePixelShader(m_device.Get(),L"Shaders\\HUD\\DX11_PS_HUDBar.hlsl", "PSColored", "ps_4_0", nullptr, blob); + m_shadowMap = RenderTarget2D(m_device.Get(), g_Configuration.shadowMapSize, g_Configuration.shadowMapSize, DXGI_FORMAT_R32_FLOAT,DXGI_FORMAT_D16_UNORM); // Initialise constant buffers m_cbCameraMatrices = createConstantBuffer(); @@ -128,7 +127,7 @@ void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool w m_cbSprite = createConstantBuffer(); m_stHUD.View = Matrix::CreateLookAt(Vector3::Zero, Vector3(0, 0, 1), Vector3(0, -1, 0)); m_stHUD.Projection =Matrix::CreateOrthographicOffCenter(0, REFERENCE_RES_WIDTH, 0, REFERENCE_RES_HEIGHT, 0, 1.0f); - m_cbHUD.updateData(m_stHUD, m_context); + m_cbHUD.updateData(m_stHUD, m_context.Get()); m_currentCausticsFrame = 0; m_firstWeather = true; @@ -165,16 +164,17 @@ void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool w blendStateDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA; blendStateDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; blendStateDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - Utils::throwIfFailed(m_device->CreateBlendState(&blendStateDesc, &m_subtractiveBlendState)); + Utils::throwIfFailed(m_device->CreateBlendState(&blendStateDesc, m_subtractiveBlendState.GetAddressOf())); D3D11_SAMPLER_DESC shadowSamplerDesc = {}; shadowSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; shadowSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; shadowSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; shadowSamplerDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL; shadowSamplerDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT; - Utils::throwIfFailed(m_device->CreateSamplerState(&shadowSamplerDesc,&m_shadowSampler)); + Utils::throwIfFailed(m_device->CreateSamplerState(&shadowSamplerDesc,m_shadowSampler.GetAddressOf())); + Utils::setName(m_shadowSampler.Get(), "ShadowSampler"); initialiseBars(); - initQuad(m_device); + initQuad(m_device.Get()); } void T5M::Renderer::Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, HWND handle, bool reset) @@ -214,8 +214,7 @@ void T5M::Renderer::Renderer11::initialiseScreen(int w, int h, int refreshRate, m_swapChain->Release(); } - m_swapChain = NULL; - Utils::throwIfFailed(dxgiFactory->CreateSwapChain(m_device, &sd, &m_swapChain)); + Utils::throwIfFailed(dxgiFactory->CreateSwapChain(m_device.Get(), &sd, &m_swapChain)); dxgiFactory->MakeWindowAssociation(handle, 0); @@ -259,14 +258,14 @@ void T5M::Renderer::Renderer11::initialiseScreen(int w, int h, int refreshRate, m_context->OMSetRenderTargets(1, &m_backBufferRTV, m_depthStencilView); // Initialise sprites and font - m_spriteBatch = new SpriteBatch(m_context); - m_gameFont = new SpriteFont(m_device, L"Font.spritefont"); - m_primitiveBatch = new PrimitiveBatch(m_context); + m_spriteBatch = std::make_unique(m_context.Get()); + m_gameFont = std::make_unique(m_device.Get(), L"Font.spritefont"); + m_primitiveBatch = std::make_unique>(m_context.Get()); // Initialise buffers - m_renderTarget = RenderTarget2D(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - m_dumpScreenRenderTarget = RenderTarget2D(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - m_reflectionCubemap = RenderTargetCube(m_device, 128, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB); + m_renderTarget = RenderTarget2D(m_device.Get(), w, h, DXGI_FORMAT_R8G8B8A8_UNORM); + m_dumpScreenRenderTarget = RenderTarget2D(m_device.Get(), w, h, DXGI_FORMAT_R8G8B8A8_UNORM); + m_reflectionCubemap = RenderTargetCube(m_device.Get(), 128, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB); // Shadow map /*D3D11_TEXTURE2D_DESC depthTexDesc; ZeroMemory(&depthTexDesc, sizeof(D3D11_TEXTURE2D_DESC)); diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index a3f0243df..4079a52b7 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -152,7 +152,7 @@ void T5M::Renderer::Renderer11::drawLara(bool transparent, bool shadowMap) m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetInputLayout(m_inputLayout); + m_context->IASetInputLayout(m_inputLayout.Get()); m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); RendererItem *item = &m_items[Lara.itemNumber]; @@ -160,13 +160,13 @@ void T5M::Renderer::Renderer11::drawLara(bool transparent, bool shadowMap) // Set shaders if (shadowMap) { - m_context->VSSetShader(m_vsShadowMap, NULL, 0); - m_context->PSSetShader(m_psShadowMap, NULL, 0); + m_context->VSSetShader(m_vsShadowMap.Get(), NULL, 0); + m_context->PSSetShader(m_psShadowMap.Get(), NULL, 0); } else { - m_context->VSSetShader(m_vsItems, NULL, 0); - m_context->PSSetShader(m_psItems, NULL, 0); + m_context->VSSetShader(m_vsItems.Get(), NULL, 0); + m_context->PSSetShader(m_psItems.Get(), NULL, 0); } // Set texture @@ -177,7 +177,7 @@ void T5M::Renderer::Renderer11::drawLara(bool transparent, bool shadowMap) m_context->PSSetSamplers(0, 1, &sampler); m_stMisc.AlphaTest = !transparent; - m_cbMisc.updateData(m_stMisc, m_context); + m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); RendererObject &laraObj = *m_moveableObjects[ID_LARA]; @@ -188,7 +188,7 @@ void T5M::Renderer::Renderer11::drawLara(bool transparent, bool shadowMap) m_stItem.Position = Vector4(LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos, 1.0f); m_stItem.AmbientLight = room.AmbientLight; memcpy(m_stItem.BonesMatrices, laraObj.AnimationTransforms.data(), sizeof(Matrix) * 32); - m_cbItem.updateData(m_stItem, m_context); + m_cbItem.updateData(m_stItem, m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); @@ -197,7 +197,7 @@ void T5M::Renderer::Renderer11::drawLara(bool transparent, bool shadowMap) m_stLights.NumLights = item->Lights.size(); for (int j = 0; j < item->Lights.size(); j++) memcpy(&m_stLights.Lights[j], item->Lights[j], sizeof(ShaderLight)); - m_cbLights.updateData(m_stLights, m_context); + m_cbLights.updateData(m_stLights, m_context.Get()); m_context->PSSetConstantBuffers(2, 1, m_cbLights.get()); } @@ -256,7 +256,7 @@ void T5M::Renderer::Renderer11::drawLara(bool transparent, bool shadowMap) matrices[i + 1] = world; } memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 7); - m_cbItem.updateData(m_stItem,m_context); + m_cbItem.updateData(m_stItem,m_context.Get()); m_context->VSSetConstantBuffers(1, 1, m_cbItem.get()); m_context->PSSetConstantBuffers(1, 1, m_cbItem.get()); diff --git a/TR5Main/Renderer/Renderer11Settings.cpp b/TR5Main/Renderer/Renderer11Settings.cpp index e5ffd3aec..e2dd12284 100644 --- a/TR5Main/Renderer/Renderer11Settings.cpp +++ b/TR5Main/Renderer/Renderer11Settings.cpp @@ -134,10 +134,6 @@ namespace T5M::Renderer { ID3D11RenderTargetView* nullViews[] = { nullptr }; m_context->OMSetRenderTargets(0, nullViews, NULL); - DX11_DELETE(m_gameFont); - DX11_DELETE(m_spriteBatch); - DX11_DELETE(m_primitiveBatch); - m_backBufferTexture->Release(); m_backBufferRTV->Release(); m_depthStencilView->Release(); diff --git a/TR5Main/Renderer/Renderer11String.cpp b/TR5Main/Renderer/Renderer11String.cpp index 9ee96e614..ca1b33ce9 100644 --- a/TR5Main/Renderer/Renderer11String.cpp +++ b/TR5Main/Renderer/Renderer11String.cpp @@ -70,11 +70,11 @@ namespace T5M::Renderer { // Draw shadow if needed if (str->Flags & PRINTSTRING_OUTLINE) - m_gameFont->DrawString(m_spriteBatch, str->String.c_str(), Vector2(str->X + 1, str->Y + 1), + m_gameFont->DrawString(m_spriteBatch.get(), str->String.c_str(), Vector2(str->X + 1, str->Y + 1), Vector4(0.0f, 0.0f, 0.0f, 1.0f)); // Draw string - m_gameFont->DrawString(m_spriteBatch, str->String.c_str(), Vector2(str->X, str->Y), + m_gameFont->DrawString(m_spriteBatch.get(), str->String.c_str(), Vector2(str->X, str->Y), Vector4(str->Color.x / 255.0f, str->Color.y / 255.0f, str->Color.z / 255.0f, 1.0f)); } diff --git a/TR5Main/Renderer/Utils.cpp b/TR5Main/Renderer/Utils.cpp index ba2c938f7..ab0cd9a37 100644 --- a/TR5Main/Renderer/Utils.cpp +++ b/TR5Main/Renderer/Utils.cpp @@ -2,9 +2,12 @@ #include "Utils.h" #include #include +#include namespace T5M::Renderer::Utils { using std::wstring; using std::string; + using Microsoft::WRL::ComPtr; + using std::vector; void Utils::throwIfFailed(const HRESULT& res) noexcept { if(FAILED(res)){ std::string message = std::system_category().message(res); @@ -14,32 +17,26 @@ namespace T5M::Renderer::Utils { } - ID3D11VertexShader* compileVertexShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ID3D10Blob** bytecode) { - HRESULT res; - - *bytecode = nullptr; - ID3DBlob* errors = nullptr; + ComPtr compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ComPtr& bytecode) noexcept { + ComPtr errors; logD("Compiling vertex shader"); - res = D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode, &errors); - throwIfFailed(res); + throwIfFailed(D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode.GetAddressOf(),errors.GetAddressOf())); ID3D11VertexShader* shader = nullptr; - res = device->CreateVertexShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), nullptr, &shader); - throwIfFailed(res); + throwIfFailed(device->CreateVertexShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, &shader)); return shader; } - ID3D11PixelShader* compilePixelShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ID3D10Blob** bytecode) noexcept { - HRESULT res; - - *bytecode = nullptr; - ID3DBlob* errors = nullptr; + ComPtr compilePixelShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ComPtr& bytecode) noexcept { + ComPtr errors; logD("Compiling pixel shader"); UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_SKIP_OPTIMIZATION; - throwIfFailed(D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode, &errors)); + throwIfFailed(D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode.GetAddressOf(), errors.GetAddressOf())); ID3D11PixelShader* shader = nullptr; - throwIfFailed(device->CreatePixelShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), nullptr, &shader)); + throwIfFailed(device->CreatePixelShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, &shader)); return shader; } - UINT Utils::GetShaderFlags() + + + UINT Utils::GetShaderFlags() noexcept { UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR; if constexpr(DebugBuild){ diff --git a/TR5Main/Renderer/Utils.h b/TR5Main/Renderer/Utils.h index 2a7460230..4acf7fd6b 100644 --- a/TR5Main/Renderer/Utils.h +++ b/TR5Main/Renderer/Utils.h @@ -1,15 +1,21 @@ #pragma once #include #include +#include namespace T5M { namespace Renderer { namespace Utils { - //throws a std::exception when the result contains a FAILED result - //In most cases we cannot run the game if some Direct3D operation failed void throwIfFailed(const HRESULT& res) noexcept; - ID3D11VertexShader* compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ID3D10Blob** bytecode); - UINT GetShaderFlags(); - ID3D11PixelShader* compilePixelShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ID3D10Blob** bytecode) noexcept; + [[nodiscard]]Microsoft::WRL::ComPtr compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr& bytecode) noexcept; + [[nodiscard]]UINT GetShaderFlags() noexcept; + [[nodiscard]]Microsoft::WRL::ComPtr compilePixelShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr& bytecode) noexcept; + template + void setName(T* object, const std::string& name) + { + ID3D11DeviceChild* childPtr = nullptr; + object->QueryInterface(&childPtr); + childPtr->SetPrivateData(WKPDID_D3DDebugObjectName, name.length(), name.c_str()); + }; } } } \ No newline at end of file From 700b3e28c02c242ad276e0062d86b46778bf0ec9 Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Mon, 10 Aug 2020 18:17:59 +0200 Subject: [PATCH 11/22] Added TriggerExplosionBubbles; Added TriggerRocketFire; Added fire to grenade; Fixed and tested grenade explosive ammos; Added flag from TR4 to TriggerUnderwaterExplosion; --- TR5Main/Game/effect2.cpp | 104 ++++++++++++++++++- TR5Main/Game/effect2.h | 4 +- TR5Main/Game/lara1gun.cpp | 103 +++++++++++++----- TR5Main/Game/lara1gun.h | 3 +- TR5Main/Objects/TR2/Vehicles/snowmobile.cpp | 2 +- TR5Main/Objects/TR3/Vehicles/quad.cpp | 2 +- TR5Main/Objects/TR4/Vehicles/jeep.cpp | 2 +- TR5Main/Objects/TR4/Vehicles/motorbike.cpp | 2 +- TR5Main/Objects/TR5/Entity/tr5_submarine.cpp | 4 +- 9 files changed, 189 insertions(+), 37 deletions(-) diff --git a/TR5Main/Game/effect2.cpp b/TR5Main/Game/effect2.cpp index 550da70b5..9dbb73c2f 100644 --- a/TR5Main/Game/effect2.cpp +++ b/TR5Main/Game/effect2.cpp @@ -14,6 +14,7 @@ #include "spark.h" #include "explosion.h" #include +#include using T5M::Renderer::g_Renderer; using T5M::Effects::Explosion::TriggerExplosion; using namespace T5M::Effects::Spark; @@ -434,6 +435,55 @@ void TriggerExplosionSparks(int x, int y, int z, int extraTrig, int dynamic, int TriggerExplosion(Vector3(x, y, z), 512, true, false, true, roomNumber); } +void TriggerExplosionBubbles(int x, int y, int z, short roomNumber) +{ + int dx = LaraItem->pos.xPos - x; + int dz = LaraItem->pos.zPos - z; + + if (dx >= -ANGLE(90) && dx <= ANGLE(90) && dz >= -ANGLE(90) && dz <= ANGLE(90)) + { + SPARKS* spark = &Sparks[GetFreeSpark()]; + + spark->sR = -128; + spark->dR = -128; + spark->dG = -128; + spark->dB = -128; + spark->on = 1; + spark->life = 24; + spark->sLife = 24; + spark->sG = 64; + spark->sB = 0; + spark->colFadeSpeed = 8; + spark->fadeToBlack = 12; + spark->transType = COLADD; + spark->x = x; + spark->y = y; + spark->z = z; + spark->xVel = 0; + spark->yVel = 0; + spark->zVel = 0; + spark->friction = 0; + spark->flags = SP_UNDERWEXP | SP_DEF | SP_SCALE; + spark->def = Objects[ID_DEFAULT_SPRITES].meshIndex + 13; + spark->scalar = 3; + spark->gravity = 0; + spark->maxYvel = 0; + int size = (GetRandomControl() & 7) + 63; + spark->sSize = size >> 1; + spark->size = size >> 1; + spark->dSize = 2 * size; + + for (int i = 0; i < 8; i++) + { + PHD_VECTOR pos; + pos.x = (GetRandomControl() & 0x1FF) + x - 256; + pos.y = (GetRandomControl() & 0x7F) + y - 64; + pos.z = (GetRandomControl() & 0x1FF) + z - 256; + CreateBubble(&pos, roomNumber, 6, 15, 0, 0, 0, 0); + } + } +} + void TriggerExplosionSmokeEnd(int x, int y, int z, int uw) { SPARKS* spark = &Sparks[GetFreeSpark()]; @@ -761,9 +811,9 @@ void TriggerSuperJetFlame(ITEM_INFO* item, int yvel, int deadly)//32EAC, 333AC ( sptr->z = (GetRandomControl() & 0x1F) + item->pos.zPos - 16; sptr->friction = 51; sptr->maxYvel = 0; - sptr->flags = 538; + sptr->flags = SP_EXPDEF | SP_ROTATE | SP_DEF | SP_SCALE; if (deadly) - sptr->flags = 539; + sptr->flags = SP_EXPDEF | SP_ROTATE | SP_DEF | SP_SCALE | SP_FLAT; sptr->scalar = 2; sptr->dSize = (GetRandomControl() & 0xF) + (size >> 6) + 16; sptr->sSize = sptr->size = sptr->dSize >> 1; @@ -1301,6 +1351,56 @@ void TriggerRocketFlame(int x, int y, int z, int xv, int yv, int zv, int itemNum sptr->size = sptr->sSize = size; } +void TriggerRocketFire(int x, int y, int z) +{ + SPARKS* sptr = &Sparks[GetFreeSpark()]; + + sptr->on = true; + + sptr->sR = sptr->sG = (GetRandomControl() & 0x1F) + 48; + sptr->sB = (GetRandomControl() & 0x3F) - 64; + sptr->dR = (GetRandomControl() & 0x3F) - 64; + sptr->dG = (GetRandomControl() & 0x3F) - 128; + sptr->dB = 32; + + sptr->colFadeSpeed = 4 + (GetRandomControl() & 3); + sptr->fadeToBlack = 12; + sptr->sLife = sptr->life = (GetRandomControl() & 3) + 20; + sptr->transType = COLADD; + sptr->extras = 0; + sptr->dynamic = -1; + + sptr->x = x + ((GetRandomControl() & 15) - 8); + sptr->y = y + ((GetRandomControl() & 15) - 8); + sptr->z = z + ((GetRandomControl() & 15) - 8); + sptr->xVel = ((GetRandomControl() & 255) - 128); + sptr->yVel = -(GetRandomControl() & 3) - 4; + sptr->zVel = ((GetRandomControl() & 255) - 128); + sptr->friction = 4; + + if (GetRandomControl() & 1) + { + sptr->flags = SP_SCALE | SP_DEF | SP_ROTATE | SP_EXPDEF; + sptr->rotAng = GetRandomControl() & 4095; + if (GetRandomControl() & 1) + sptr->rotAdd = -(GetRandomControl() & 15) - 16; + else + sptr->rotAdd = (GetRandomControl() & 15) + 16; + } + else + sptr->flags = SP_SCALE | SP_DEF | SP_EXPDEF; + + // TODO: right sprite + sptr->def = Objects[ID_DEFAULT_SPRITES].meshIndex; + sptr->scalar = 3; + sptr->gravity = -(GetRandomControl() & 3) - 4; + sptr->maxYvel = -(GetRandomControl() & 3) - 4; + + int size = (GetRandomControl() & 7) + 32; + sptr->size = sptr->sSize = size >> 2; +} + + void TriggerRocketSmoke(int x, int y, int z, int bodyPart) { SPARKS* sptr = &Sparks[GetFreeSpark()]; diff --git a/TR5Main/Game/effect2.h b/TR5Main/Game/effect2.h index 267e11151..4fe40dc7a 100644 --- a/TR5Main/Game/effect2.h +++ b/TR5Main/Game/effect2.h @@ -213,4 +213,6 @@ void GrenadeLauncherSpecialEffect1(int x, int y, int z, int flag1, int flag2); void GrenadeExplosionEffects(int x, int y, int z, short roomNumber); void TriggerMetalSparks(int x, int y, int z, int xv, int yv, int zv, int additional); void WadeSplash(ITEM_INFO* item, int wh, int wd); -void Splash(ITEM_INFO* item); \ No newline at end of file +void Splash(ITEM_INFO* item); +void TriggerRocketFire(int x, int y, int z); +void TriggerExplosionBubbles(int x, int y, int z, short roomNumber); \ No newline at end of file diff --git a/TR5Main/Game/lara1gun.cpp b/TR5Main/Game/lara1gun.cpp index 930402895..079acf6df 100644 --- a/TR5Main/Game/lara1gun.cpp +++ b/TR5Main/Game/lara1gun.cpp @@ -345,7 +345,7 @@ void ControlGrenade(short itemNumber) if (item->itemFlags[1]) { - if (item->itemFlags[0] == WEAPON_AMMO3) + if (item->itemFlags[0] == GRENADE_FLASH) { // Flash grenades @@ -384,7 +384,7 @@ void ControlGrenade(short itemNumber) InitialiseItem(newGrenadeItemNumber); - newGrenade->pos.xRot = (GetRandomControl() & 0x3FFF) + 0x2000; + newGrenade->pos.xRot = (GetRandomControl() & 0x3FFF) + ANGLE(45); newGrenade->pos.yRot = GetRandomControl() * 2; newGrenade->pos.zRot = 0; newGrenade->speed = 64; @@ -397,8 +397,9 @@ void ControlGrenade(short itemNumber) newGrenade->status = ITEM_INVISIBLE; newGrenade->itemFlags[2] = item->itemFlags[2]; - newGrenade->hitPoints = 3000; - + newGrenade->hitPoints = 60; // 3000; + newGrenade->itemFlags[0] = GRENADE_NORMAL; + if (g_Level.Rooms[newGrenade->roomNumber].flags & ENV_FLAG_WATER) newGrenade->hitPoints = 1; } @@ -464,6 +465,7 @@ void ControlGrenade(short itemNumber) int wz = world.Translation().z; TriggerRocketSmoke(wx + item->pos.xPos, wy + item->pos.yPos, wz + item->pos.zPos, -1); + TriggerRocketFire(wx + item->pos.xPos, wy + item->pos.yPos, wz + item->pos.zPos); } xv = ((item->speed * phd_sin(item->goalAnimState)) >> W2V_SHIFT); @@ -694,7 +696,7 @@ void ControlGrenade(short itemNumber) } else if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) { - TriggerUnderwaterExplosion(item); + TriggerUnderwaterExplosion(item, 0); } else { @@ -1048,7 +1050,7 @@ void ControlCrossbowBolt(short itemNumber) if (GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) < item->pos.yPos || GetCeiling(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) > item->pos.yPos) { - // I have hit the room, this is the end for the bolt + // I have hit a solid wall, this is the end for the bolt item->pos.xPos = oldX; item->pos.yPos = oldY; item->pos.zPos = oldZ; @@ -1074,6 +1076,7 @@ void ControlCrossbowBolt(short itemNumber) // If now in water and before in land, add a ripple if ((g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) && land) { + SetupRipple(item->pos.xPos, g_Level.Rooms[item->roomNumber].minfloor, item->pos.zPos, (GetRandomControl() & 7) + 8, 0); } @@ -1191,7 +1194,7 @@ void ControlCrossbowBolt(short itemNumber) // At this point, for sure bolt must explode if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) { - TriggerUnderwaterExplosion(item); + TriggerUnderwaterExplosion(item, 0); } else { @@ -1345,7 +1348,7 @@ void FireCrossbow(PHD_3DPOS* pos) item->itemFlags[0] = Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo; - SoundEffect(235, 0, 0); + SoundEffect(SFX_TR4_LARA_CROSSBOW, 0, 0); Savegame.Level.AmmoUsed++; Savegame.Game.AmmoUsed++; @@ -1387,29 +1390,75 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src) } } -void TriggerUnderwaterExplosion(ITEM_INFO* item) +void SomeSparkEffect(int x, int y, int z, int count) { - TriggerExplosionBubble(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber); - TriggerExplosionSparks(item->pos.xPos, item->pos.yPos, item->pos.zPos, 2, -2, 1, item->roomNumber); - - for (int i = 0; i < 3; i++) + for (int i = 0; i < count; i++) { - TriggerExplosionSparks(item->pos.xPos, item->pos.yPos, item->pos.zPos, 2, -1, 1, item->roomNumber); + SPARKS* spark = &Sparks[GetFreeSpark()]; + spark->on = 1; + spark->sR = 112; + spark->sG = (GetRandomControl() & 0x1F) + -128; + spark->sB = (GetRandomControl() & 0x1F) + -128; + spark->colFadeSpeed = 4; + spark->fadeToBlack = 8; + spark->life = 24; + spark->dR = spark->sR >> 1; + spark->dG = spark->sG >> 1; + spark->dB = spark->sB >> 1; + spark->sLife = 24; + spark->transType = COLADD; + spark->friction = 5; + spark->xVel = -128 * phd_sin(GetRandomControl()); + spark->yVel = -640 - (byte)GetRandomControl(); + spark->zVel = -128 * phd_cos(GetRandomControl()); + spark->flags = 0; + spark->x = x + (spark->xVel >> 3); + spark->y = y - (spark->yVel >> 5); + spark->z = z + (spark->zVel >> 3); + spark->maxYvel = 0; + spark->gravity = (GetRandomControl() & 0xF) + 64; } - - int wh = GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber); - if (wh != NO_HEIGHT) - { - int dy = item->pos.yPos - wh; - if (dy < 2048) - { - SplashSetup.y = wh; - SplashSetup.x = item->pos.xPos; - SplashSetup.z = item->pos.zPos; - SplashSetup.innerRadius = 160; - SplashSetup.splashPower = 2048 - dy; +} - SetupSplash(&SplashSetup,item->roomNumber); +void TriggerUnderwaterExplosion(ITEM_INFO* item, int flag) +{ + if (flag) + { + int x = (GetRandomControl() & 0x1FF) + item->pos.xPos - 256; + int y = item->pos.yPos; + int z = (GetRandomControl() & 0x1FF) + item->pos.zPos - 256; + + TriggerExplosionBubbles(x, y, z, item->roomNumber); + TriggerExplosionSparks(x, y, z, 2, -1, 1, item->roomNumber); + + int wh = GetWaterHeight(x, y, z, item->roomNumber); + if (wh != NO_HEIGHT) + SomeSparkEffect(x, wh, z, 8); + } + else + { + TriggerExplosionBubble(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber); + TriggerExplosionSparks(item->pos.xPos, item->pos.yPos, item->pos.zPos, 2, -2, 1, item->roomNumber); + + for (int i = 0; i < 3; i++) + { + TriggerExplosionSparks(item->pos.xPos, item->pos.yPos, item->pos.zPos, 2, -1, 1, item->roomNumber); + } + + int wh = GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber); + if (wh != NO_HEIGHT) + { + int dy = item->pos.yPos - wh; + if (dy < 2048) + { + SplashSetup.y = wh; + SplashSetup.x = item->pos.xPos; + SplashSetup.z = item->pos.zPos; + SplashSetup.innerRadius = 160; + SplashSetup.splashPower = 2048 - dy; + + SetupSplash(&SplashSetup, item->roomNumber); + } } } } diff --git a/TR5Main/Game/lara1gun.h b/TR5Main/Game/lara1gun.h index 2de8ce144..fcac24532 100644 --- a/TR5Main/Game/lara1gun.h +++ b/TR5Main/Game/lara1gun.h @@ -31,7 +31,7 @@ void ControlCrossbowBolt(short itemNumber); void FireCrossbow(PHD_3DPOS* pos); void RifleHandler(int weaponType); void DoGrenadeDamageOnBaddie(ITEM_INFO* src, ITEM_INFO* dest); -void TriggerUnderwaterExplosion(ITEM_INFO* item); +void TriggerUnderwaterExplosion(ITEM_INFO* item, int flag); void undraw_shotgun_meshes(int weapon); void undraw_shotgun(int weapon); void draw_shotgun_meshes(int weaponType); @@ -39,3 +39,4 @@ void FireHK(int mode); void FireShotgun(); void DoCrossbowDamage(ITEM_INFO* item1, ITEM_INFO* item2, signed int search); void ready_shotgun(int weaponType); +void SomeSparkEffect(int x, int y, int z, int count); \ No newline at end of file diff --git a/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp b/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp index 761675f2a..89f6588b5 100644 --- a/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp +++ b/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp @@ -179,7 +179,7 @@ static void SkidooExplode(ITEM_INFO* skidoo) { if (g_Level.Rooms[skidoo->roomNumber].flags & ENV_FLAG_WATER) { - TriggerUnderwaterExplosion(skidoo); + TriggerUnderwaterExplosion(skidoo, 1); } else { diff --git a/TR5Main/Objects/TR3/Vehicles/quad.cpp b/TR5Main/Objects/TR3/Vehicles/quad.cpp index a906d1ea5..2cfd5e287 100644 --- a/TR5Main/Objects/TR3/Vehicles/quad.cpp +++ b/TR5Main/Objects/TR3/Vehicles/quad.cpp @@ -142,7 +142,7 @@ static void QuadbikeExplode(ITEM_INFO* item) { if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) { - TriggerUnderwaterExplosion(item); + TriggerUnderwaterExplosion(item, 1); } else { diff --git a/TR5Main/Objects/TR4/Vehicles/jeep.cpp b/TR5Main/Objects/TR4/Vehicles/jeep.cpp index e4e942814..020edfd44 100644 --- a/TR5Main/Objects/TR4/Vehicles/jeep.cpp +++ b/TR5Main/Objects/TR4/Vehicles/jeep.cpp @@ -590,7 +590,7 @@ static void JeepExplode(ITEM_INFO* item) { if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) { - TriggerUnderwaterExplosion(item); + TriggerUnderwaterExplosion(item, 1); } else { diff --git a/TR5Main/Objects/TR4/Vehicles/motorbike.cpp b/TR5Main/Objects/TR4/Vehicles/motorbike.cpp index fa2dbd61c..6a704caf6 100644 --- a/TR5Main/Objects/TR4/Vehicles/motorbike.cpp +++ b/TR5Main/Objects/TR4/Vehicles/motorbike.cpp @@ -462,7 +462,7 @@ static void MotorBikeExplode(ITEM_INFO* item) { if (g_Level.Rooms[item->roomNumber].flags & (ENV_FLAG_WATER|ENV_FLAG_SWAMP)) { - TriggerUnderwaterExplosion(item); + TriggerUnderwaterExplosion(item, 1); } else { diff --git a/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp b/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp index 6c490c9fd..567c5876b 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp @@ -586,7 +586,7 @@ void TorpedoControl(short itemNumber) { LaraItem->hitStatus = true; KillItem(itemNumber); - TriggerUnderwaterExplosion(item); + TriggerUnderwaterExplosion(item, 1); SoundEffect(SFX_UNDERWATER_EXPLOSION, &item->pos, 2); SoundEffect(SFX_LARA_UNDERWATER_HIT, &LaraItem->pos, 2); LaraItem->hitPoints -= 200; @@ -623,7 +623,7 @@ void TorpedoControl(short itemNumber) item->pos.xPos = x; item->pos.yPos = y; item->pos.zPos = z; - TriggerUnderwaterExplosion(item); + TriggerUnderwaterExplosion(item, 1); SoundEffect(SFX_UNDERWATER_EXPLOSION, &item->pos, 2); KillItem(itemNumber); } From 8df350b07262c755f66e74a237bc2a246c261d4a Mon Sep 17 00:00:00 2001 From: Woops Date: Mon, 10 Aug 2020 13:01:53 -0500 Subject: [PATCH 12/22] uncomment hotkeys --- TR5Main/Specific/input.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/TR5Main/Specific/input.cpp b/TR5Main/Specific/input.cpp index b8ae32ae3..3e848065c 100644 --- a/TR5Main/Specific/input.cpp +++ b/TR5Main/Specific/input.cpp @@ -306,15 +306,15 @@ int S_UpdateInput()// (F) Lara.requestGunType = WEAPON_REVOLVER; if (KeyMap[DIK_4] && Lara.Weapons[WEAPON_UZI].Present == true) Lara.requestGunType = WEAPON_UZI; - /* if (KeyMap[DIK_5] && Lara.Weapons[WEAPON_HARPOON_GUN].Present == true) - Lara.requestGunType = WEAPON_HARPOON_GUN;*/ + if (KeyMap[DIK_5] && Lara.Weapons[WEAPON_HARPOON_GUN].Present == true) + Lara.requestGunType = WEAPON_HARPOON_GUN; if (KeyMap[DIK_6] && Lara.Weapons[WEAPON_HK].Present == true) Lara.requestGunType = WEAPON_HK; - /* if (KeyMap[DIK_7] && Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present == true) - Lara.requestGunType = WEAPON_ROCKET_LAUNCHER; - if (KeyMap[DIK_8] && Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present == true) - Lara.requestGunType = WEAPON_GRENADE_LAUNCHER*/ - /*------------------------------------------------------------------*/ + if (KeyMap[DIK_7] && Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present == true) + Lara.requestGunType = WEAPON_ROCKET_LAUNCHER; + if (KeyMap[DIK_8] && Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present == true) + Lara.requestGunType = WEAPON_GRENADE_LAUNCHER; + /*------------------------------------------------------------------*/ if (KeyMap[DIK_0]) { From f137d54f07f76b55b2fee90343e44231ba9c5f87 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Mon, 10 Aug 2020 20:44:12 +0200 Subject: [PATCH 13/22] Minor cleanup --- TR5Main/Renderer/Renderer11Init.cpp | 2 +- TR5Main/Renderer/Utils.cpp | 24 +++++++++++++++++------- TR5Main/Renderer/Utils.h | 14 ++++---------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 6bd99368f..2ff93173a 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -172,7 +172,7 @@ void T5M::Renderer::Renderer11::Initialise(int w, int h, int refreshRate, bool w shadowSamplerDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL; shadowSamplerDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT; Utils::throwIfFailed(m_device->CreateSamplerState(&shadowSamplerDesc,m_shadowSampler.GetAddressOf())); - Utils::setName(m_shadowSampler.Get(), "ShadowSampler"); + m_shadowSampler->SetPrivateData(WKPDID_D3DDebugObjectName, sizeof("ShadowSampler") + 1, "ShadowSampler"); initialiseBars(); initQuad(m_device.Get()); } diff --git a/TR5Main/Renderer/Utils.cpp b/TR5Main/Renderer/Utils.cpp index ab0cd9a37..541ff155c 100644 --- a/TR5Main/Renderer/Utils.cpp +++ b/TR5Main/Renderer/Utils.cpp @@ -17,26 +17,36 @@ namespace T5M::Renderer::Utils { } - ComPtr compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ComPtr& bytecode) noexcept { + ComPtr compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ComPtr& bytecode) { ComPtr errors; logD("Compiling vertex shader"); throwIfFailed(D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode.GetAddressOf(),errors.GetAddressOf())); - ID3D11VertexShader* shader = nullptr; - throwIfFailed(device->CreateVertexShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, &shader)); + ComPtr shader; + throwIfFailed(device->CreateVertexShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, shader.GetAddressOf())); + if constexpr(DebugBuild){ + char buffer[100]; + size_t sz = std::wcstombs(buffer, fileName.c_str(), 100); + shader->SetPrivateData(WKPDID_D3DDebugObjectName, sz, buffer); + } return shader; } - ComPtr compilePixelShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ComPtr& bytecode) noexcept { + ComPtr compilePixelShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ComPtr& bytecode) { ComPtr errors; logD("Compiling pixel shader"); UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_SKIP_OPTIMIZATION; throwIfFailed(D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode.GetAddressOf(), errors.GetAddressOf())); - ID3D11PixelShader* shader = nullptr; - throwIfFailed(device->CreatePixelShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, &shader)); + ComPtr shader; + throwIfFailed(device->CreatePixelShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, shader.GetAddressOf())); + if constexpr(DebugBuild){ + char buffer[100]; + size_t sz = std::wcstombs(buffer, fileName.c_str(), 100); + shader->SetPrivateData(WKPDID_D3DDebugObjectName, sz, buffer); + } return shader; } - UINT Utils::GetShaderFlags() noexcept + constexpr UINT Utils::GetShaderFlags() { UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR; if constexpr(DebugBuild){ diff --git a/TR5Main/Renderer/Utils.h b/TR5Main/Renderer/Utils.h index 4acf7fd6b..331bf2ba0 100644 --- a/TR5Main/Renderer/Utils.h +++ b/TR5Main/Renderer/Utils.h @@ -6,16 +6,10 @@ namespace T5M { namespace Renderer { namespace Utils { void throwIfFailed(const HRESULT& res) noexcept; - [[nodiscard]]Microsoft::WRL::ComPtr compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr& bytecode) noexcept; - [[nodiscard]]UINT GetShaderFlags() noexcept; - [[nodiscard]]Microsoft::WRL::ComPtr compilePixelShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr& bytecode) noexcept; - template - void setName(T* object, const std::string& name) - { - ID3D11DeviceChild* childPtr = nullptr; - object->QueryInterface(&childPtr); - childPtr->SetPrivateData(WKPDID_D3DDebugObjectName, name.length(), name.c_str()); - }; + [[nodiscard]] Microsoft::WRL::ComPtr compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr& bytecode); + constexpr [[nodiscard]] UINT GetShaderFlags(); + [[nodiscard]] Microsoft::WRL::ComPtr compilePixelShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr& bytecode); + } } } \ No newline at end of file From 83effc6e2cda5bc0b228bb7bd6561208075b511a Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Tue, 11 Aug 2020 17:27:51 +0200 Subject: [PATCH 14/22] Fallback Camera Vector if Position and Target share position --- TR5Main/Renderer/RenderView/RenderView.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TR5Main/Renderer/RenderView/RenderView.cpp b/TR5Main/Renderer/RenderView/RenderView.cpp index fe0296031..9589f9bd9 100644 --- a/TR5Main/Renderer/RenderView/RenderView.cpp +++ b/TR5Main/Renderer/RenderView/RenderView.cpp @@ -47,7 +47,8 @@ namespace T5M::Renderer { WorldPosition = Vector3(cam->pos.x, cam->pos.y, cam->pos.z); Vector3 target = Vector3(cam->target.x, cam->target.y, cam->target.z); WorldDirection = Vector3(cam->target.x, cam->target.y, cam->target.z) - WorldPosition; - WorldDirection.Normalize(); + if (WorldDirection == Vector3::Zero) [[unlikely]] + WorldDirection = Vector3::UnitZ; Vector3 up = -Vector3::UnitY; Matrix upRotation = Matrix::CreateFromYawPitchRoll(0.0f, 0.0f, roll); up = Vector3::Transform(up, upRotation); From 82b3944dde10cf581c8d2da333e129c89f453246 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Tue, 11 Aug 2020 19:18:36 +0200 Subject: [PATCH 15/22] Deactivated Pool memory @TODO: Fix Pool Changed pointers for ChunkIds to smart pointers --- TR5Main/Game/memory/malloc.cpp | 6 + TR5Main/Game/memory/malloc.h | 4 + TR5Main/Game/savegame.cpp | 281 ++++++++++++--------------- TR5Main/Game/savegame.h | 82 ++++---- TR5Main/Scripting/GameFlowScript.cpp | 62 +++--- TR5Main/Specific/IO/ChunkId.cpp | 12 +- TR5Main/Specific/IO/ChunkId.h | 10 +- TR5Main/Specific/IO/ChunkReader.cpp | 8 +- TR5Main/Specific/winmain.cpp | 3 - 9 files changed, 217 insertions(+), 251 deletions(-) diff --git a/TR5Main/Game/memory/malloc.cpp b/TR5Main/Game/memory/malloc.cpp index 694ad3137..28432de88 100644 --- a/TR5Main/Game/memory/malloc.cpp +++ b/TR5Main/Game/memory/malloc.cpp @@ -11,10 +11,16 @@ int malloc_used; TGPool* gameMemory; void init_game_malloc() noexcept { +#if CUSTOM_MEMORY gameMemory = new TGPool(8 * 1024 * 1024); +#endif } void game_free(void* ptr) noexcept { +#if CUSTOM_MEMORY gameMemory->free(ptr); +#else + delete[] ptr; +#endif } \ No newline at end of file diff --git a/TR5Main/Game/memory/malloc.h b/TR5Main/Game/memory/malloc.h index ba1aff72a..536f34a7c 100644 --- a/TR5Main/Game/memory/malloc.h +++ b/TR5Main/Game/memory/malloc.h @@ -11,7 +11,11 @@ extern T5M::Memory::TGPool* gameMemory; template [[nodiscard]] T* game_malloc(size_t count = 1,Args&&...args) noexcept { +#if CUSTOM_MEMORY return gameMemory->malloc(count,std::forward(args)...); +#else + return new T[count]{std::forward(args)...}; +#endif } void init_game_malloc() noexcept; void game_free(void* ptr) noexcept; \ No newline at end of file diff --git a/TR5Main/Game/savegame.cpp b/TR5Main/Game/savegame.cpp index a5ac83e9f..ae589ca3d 100644 --- a/TR5Main/Game/savegame.cpp +++ b/TR5Main/Game/savegame.cpp @@ -25,47 +25,47 @@ ChunkWriter* SaveGame::m_writer; vector SaveGame::m_luaVariables; int SaveGame::LastSaveGame; -ChunkId* SaveGame::m_chunkGameStatus; -ChunkId* SaveGame::m_chunkItems; -ChunkId* SaveGame::m_chunkItem; -ChunkId* SaveGame::m_chunkLara; -ChunkId* SaveGame::m_chunkLuaVariable; -ChunkId* SaveGame::m_chunkStaticFlags; -ChunkId* SaveGame::m_chunkVehicle; -ChunkId* SaveGame::m_chunkSequenceSwitch; -ChunkId* SaveGame::m_chunkFlybyFlags; -ChunkId* SaveGame::m_chunkCdFlags; -ChunkId* SaveGame::m_chunkCamera; -ChunkId* SaveGame::m_chunkFlipStats; -ChunkId* SaveGame::m_chunkFlipMap; -ChunkId* SaveGame::m_chunkItemDummy; -ChunkId* SaveGame::m_chunkStatistics; -ChunkId* SaveGame::m_chunkItemAnims; -ChunkId* SaveGame::m_chunkItemMeshes; -ChunkId* SaveGame::m_chunkItemFlags; -ChunkId* SaveGame::m_chunkItemHitPoints; -ChunkId* SaveGame::m_chunkItemPosition; -ChunkId* SaveGame::m_chunkItemIntelligentData; -ChunkId* SaveGame::m_chunkSpecialItemBurningTorch; -ChunkId* SaveGame::m_chunkSpecialItemChaff; -ChunkId* SaveGame::m_chunkSpecialItemTorpedo; -ChunkId* SaveGame::m_chunkSpecialItemCrossbowBolt; -ChunkId* SaveGame::m_chunkSpecialItemFlare; -ChunkId* SaveGame::m_chunkItemQuadInfo; -ChunkId* SaveGame::m_chunkBats; -ChunkId* SaveGame::m_chunkRats; -ChunkId* SaveGame::m_chunkSpiders; -ChunkId* SaveGame::m_chunkLaraExtraInfo; -ChunkId* SaveGame::m_chunkWeaponInfo; -ChunkId* SaveGame::m_chunkPuzzle; -ChunkId* SaveGame::m_chunkKey; -ChunkId* SaveGame::m_chunkPickup; -ChunkId* SaveGame::m_chunkExamine; -ChunkId* SaveGame::m_chunkPuzzleCombo; -ChunkId* SaveGame::m_chunkKeyCombo; -ChunkId* SaveGame::m_chunkPickupCombo; -ChunkId* SaveGame::m_chunkExamineCombo; -ChunkId* SaveGame::m_chunkWeaponItem; +std::unique_ptr SaveGame::m_chunkGameStatus; +std::unique_ptr SaveGame::m_chunkItems; +std::unique_ptr SaveGame::m_chunkItem; +std::unique_ptr SaveGame::m_chunkLara; +std::unique_ptr SaveGame::m_chunkLuaVariable; +std::unique_ptr SaveGame::m_chunkStaticFlags; +std::unique_ptr SaveGame::m_chunkVehicle; +std::unique_ptr SaveGame::m_chunkSequenceSwitch; +std::unique_ptr SaveGame::m_chunkFlybyFlags; +std::unique_ptr SaveGame::m_chunkCdFlags; +std::unique_ptr SaveGame::m_chunkCamera; +std::unique_ptr SaveGame::m_chunkFlipStats; +std::unique_ptr SaveGame::m_chunkFlipMap; +std::unique_ptr SaveGame::m_chunkItemDummy; +std::unique_ptr SaveGame::m_chunkStatistics; +std::unique_ptr SaveGame::m_chunkItemAnims; +std::unique_ptr SaveGame::m_chunkItemMeshes; +std::unique_ptr SaveGame::m_chunkItemFlags; +std::unique_ptr SaveGame::m_chunkItemHitPoints; +std::unique_ptr SaveGame::m_chunkItemPosition; +std::unique_ptr SaveGame::m_chunkItemIntelligentData; +std::unique_ptr SaveGame::m_chunkSpecialItemBurningTorch; +std::unique_ptr SaveGame::m_chunkSpecialItemChaff; +std::unique_ptr SaveGame::m_chunkSpecialItemTorpedo; +std::unique_ptr SaveGame::m_chunkSpecialItemCrossbowBolt; +std::unique_ptr SaveGame::m_chunkSpecialItemFlare; +std::unique_ptr SaveGame::m_chunkItemQuadInfo; +std::unique_ptr SaveGame::m_chunkBats; +std::unique_ptr SaveGame::m_chunkRats; +std::unique_ptr SaveGame::m_chunkSpiders; +std::unique_ptr SaveGame::m_chunkLaraExtraInfo; +std::unique_ptr SaveGame::m_chunkWeaponInfo; +std::unique_ptr SaveGame::m_chunkPuzzle; +std::unique_ptr SaveGame::m_chunkKey; +std::unique_ptr SaveGame::m_chunkPickup; +std::unique_ptr SaveGame::m_chunkExamine; +std::unique_ptr SaveGame::m_chunkPuzzleCombo; +std::unique_ptr SaveGame::m_chunkKeyCombo; +std::unique_ptr SaveGame::m_chunkPickupCombo; +std::unique_ptr SaveGame::m_chunkExamineCombo; +std::unique_ptr SaveGame::m_chunkWeaponItem; SAVEGAME_INFO Savegame; extern vector g_AudioTracks; @@ -78,7 +78,7 @@ void SaveGame::saveItems() { // Save level items for (int i = 0; i < g_Level.NumItems; i++) - m_writer->WriteChunkWithChildren(m_chunkItem, &saveItem, i, 0); + m_writer->WriteChunkWithChildren(m_chunkItem.get(), &saveItem, i, 0); // Save items created at runtime (flares, missiles...) for (int i = g_Level.NumItems; i < NUM_ITEMS; i++) @@ -88,17 +88,17 @@ void SaveGame::saveItems() { // Some items are very special and are saved in specific functions, all the others use the general function if (item->objectNumber == ID_BURNING_TORCH_ITEM) - m_writer->WriteChunk(m_chunkSpecialItemBurningTorch, &saveBurningTorch, i, 1); + m_writer->WriteChunk(m_chunkSpecialItemBurningTorch.get(), &saveBurningTorch, i, 1); else if (item->objectNumber == ID_CHAFF) - m_writer->WriteChunk(m_chunkSpecialItemChaff, &saveChaff, i, 1); + m_writer->WriteChunk(m_chunkSpecialItemChaff.get(), &saveChaff, i, 1); else if (item->objectNumber == ID_TORPEDO) - m_writer->WriteChunk(m_chunkSpecialItemTorpedo, &saveTorpedo, i, 1); + m_writer->WriteChunk(m_chunkSpecialItemTorpedo.get(), &saveTorpedo, i, 1); else if (item->objectNumber == ID_CROSSBOW_BOLT) - m_writer->WriteChunk(m_chunkSpecialItemCrossbowBolt, &saveCrossbowBolt, i, 1); + m_writer->WriteChunk(m_chunkSpecialItemCrossbowBolt.get(), &saveCrossbowBolt, i, 1); else if (item->objectNumber == ID_FLARE_ITEM) - m_writer->WriteChunk(m_chunkSpecialItemFlare, &saveFlare, i, 1); + m_writer->WriteChunk(m_chunkSpecialItemFlare.get(), &saveFlare, i, 1); else - m_writer->WriteChunkWithChildren(m_chunkItem, &saveItem, i, 1); + m_writer->WriteChunkWithChildren(m_chunkItem.get(), &saveItem, i, 1); } } @@ -106,17 +106,17 @@ void SaveGame::saveItems() if (Objects[ID_BATS_EMITTER].loaded) for (int i = 0; i < NUM_BATS; i++) if (Bats[i].on) - m_writer->WriteChunk(m_chunkBats, &saveBats, i, 0); + m_writer->WriteChunk(m_chunkBats.get(), &saveBats, i, 0); if (Objects[ID_RATS_EMITTER].loaded) for (int i = 0; i < NUM_RATS; i++) if (Rats[i].on) - m_writer->WriteChunk(m_chunkRats, &saveRats, i, 0); + m_writer->WriteChunk(m_chunkRats.get(), &saveRats, i, 0); if (Objects[ID_SPIDERS_EMITTER].loaded) for (int i = 0; i < NUM_SPIDERS; i++) if (Spiders[i].on) - m_writer->WriteChunk(m_chunkSpiders, &saveSpiders, i, 0); + m_writer->WriteChunk(m_chunkSpiders.get(), &saveSpiders, i, 0); } void SaveGame::saveItem(int itemNumber, int runtimeItem) @@ -150,29 +150,29 @@ void SaveGame::saveItem(int itemNumber, int runtimeItem) if (hasData) { - m_writer->WriteChunkInt(m_chunkItemDummy, 1); + m_writer->WriteChunkInt(m_chunkItemDummy.get(), 1); if (obj->saveAnim) - m_writer->WriteChunk(m_chunkItemAnims, &saveItemAnims, itemNumber, 0); + m_writer->WriteChunk(m_chunkItemAnims.get(), &saveItemAnims, itemNumber, 0); if (obj->savePosition) - m_writer->WriteChunk(m_chunkItemPosition, &saveItemPosition, itemNumber, 0); + m_writer->WriteChunk(m_chunkItemPosition.get(), &saveItemPosition, itemNumber, 0); if (obj->saveHitpoints) - m_writer->WriteChunk(m_chunkItemHitPoints, &saveItemHitPoints, itemNumber, 0); + m_writer->WriteChunk(m_chunkItemHitPoints.get(), &saveItemHitPoints, itemNumber, 0); if (obj->saveFlags) - m_writer->WriteChunkWithChildren(m_chunkItemFlags, &saveItemFlags, itemNumber, 0); + m_writer->WriteChunkWithChildren(m_chunkItemFlags.get(), &saveItemFlags, itemNumber, 0); if (obj->saveMesh) - m_writer->WriteChunk(m_chunkItemMeshes, &saveItemMesh, itemNumber, 0); + m_writer->WriteChunk(m_chunkItemMeshes.get(), &saveItemMesh, itemNumber, 0); if (obj->intelligent && item->data != NULL) - m_writer->WriteChunk(m_chunkItemIntelligentData, &saveItemIntelligentData, itemNumber, 0); + m_writer->WriteChunk(m_chunkItemIntelligentData.get(), &saveItemIntelligentData, itemNumber, 0); } else { - m_writer->WriteChunkInt(m_chunkItemDummy, 1); + m_writer->WriteChunkInt(m_chunkItemDummy.get(), 1); } } @@ -188,25 +188,25 @@ void SaveGame::saveGameStatus(int arg1, int arg2) // Now the sub-chunks for (int i = 0; i < g_Level.Rooms.size(); i++) for (int j = 0; j < g_Level.Rooms[i].mesh.size(); j++) - m_writer->WriteChunk(m_chunkStaticFlags, &saveStaticFlag, i, j); + m_writer->WriteChunk(m_chunkStaticFlags.get(), &saveStaticFlag, i, j); for (int i = 0; i < 6; i++) - m_writer->WriteChunk(m_chunkSequenceSwitch, &saveSequenceSwitch, i, SequenceUsed[i]); + m_writer->WriteChunk(m_chunkSequenceSwitch.get(), &saveSequenceSwitch, i, SequenceUsed[i]); for (int i = 0; i < NumberSpotcams; i++) - m_writer->WriteChunk(m_chunkFlybyFlags, &saveFlybyFlags, i, SpotCam[i].flags); + m_writer->WriteChunk(m_chunkFlybyFlags.get(), &saveFlybyFlags, i, SpotCam[i].flags); for (int i = 0; i < g_AudioTracks.size(); i++) - m_writer->WriteChunk(m_chunkCdFlags, &saveCdFlags, i, g_AudioTracks[i].Mask); + m_writer->WriteChunk(m_chunkCdFlags.get(), &saveCdFlags, i, g_AudioTracks[i].Mask); for (int i = 0; i < NumberCameras; i++) - m_writer->WriteChunk(m_chunkCamera, &saveCamera, i, FixedCameras[i].flags); + m_writer->WriteChunk(m_chunkCamera.get(), &saveCamera, i, FixedCameras[i].flags); for (int i = 0; i < 255; i++) - m_writer->WriteChunk(m_chunkFlipStats, &saveFlipStats, i, FlipStats[i]); + m_writer->WriteChunk(m_chunkFlipStats.get(), &saveFlipStats, i, FlipStats[i]); for (int i = 0; i < 255; i++) - m_writer->WriteChunk(m_chunkFlipMap, &saveFlipMap, i, FlipMap[i]); + m_writer->WriteChunk(m_chunkFlipMap.get(), &saveFlipMap, i, FlipMap[i]); } void SaveGame::saveLara(int arg1, int arg2) @@ -223,64 +223,64 @@ void SaveGame::saveLara(int arg1, int arg2) // Lara weapon data if (Lara.weaponItem != NO_ITEM) - m_writer->WriteChunk(m_chunkWeaponItem, &saveWeaponItem, Lara.weaponItem, 0); + m_writer->WriteChunk(m_chunkWeaponItem.get(), &saveWeaponItem, Lara.weaponItem, 0); // Save Lara extra info - m_writer->WriteChunk(m_chunkLaraExtraInfo, &saveLaraExtraInfo, 0, 0); + m_writer->WriteChunk(m_chunkLaraExtraInfo.get(), &saveLaraExtraInfo, 0, 0); // Save carried weapons for (int i = 0; i < NUM_WEAPONS; i++) { - m_writer->WriteChunk(m_chunkWeaponInfo, &saveWeaponInfo, i, 0); + m_writer->WriteChunk(m_chunkWeaponInfo.get(), &saveWeaponInfo, i, 0); } // Save carried puzzles, keys, pickups and examines for (int i = 0; i < NUM_PUZZLES; i++) { if (Lara.Puzzles[i] > 0) - m_writer->WriteChunk(m_chunkPuzzle, &savePuzzle, i, Lara.Puzzles[i]); + m_writer->WriteChunk(m_chunkPuzzle.get(), &savePuzzle, i, Lara.Puzzles[i]); } for (int i = 0; i < NUM_PUZZLES * 2; i++) { if (Lara.PuzzlesCombo[i] > 0) - m_writer->WriteChunk(m_chunkPuzzleCombo, &savePuzzle, i, Lara.PuzzlesCombo[i]); + m_writer->WriteChunk(m_chunkPuzzleCombo.get(), &savePuzzle, i, Lara.PuzzlesCombo[i]); } for (int i = 0; i < NUM_KEYS; i++) { if (Lara.Keys[i] > 0) - m_writer->WriteChunk(m_chunkKey, &savePuzzle, i, Lara.Keys[i]); + m_writer->WriteChunk(m_chunkKey.get(), &savePuzzle, i, Lara.Keys[i]); } for (int i = 0; i < NUM_KEYS * 2; i++) { if (Lara.KeysCombo[i] > 0) - m_writer->WriteChunk(m_chunkKeyCombo, &savePuzzle, i, Lara.KeysCombo[i]); + m_writer->WriteChunk(m_chunkKeyCombo.get(), &savePuzzle, i, Lara.KeysCombo[i]); } for (int i = 0; i < NUM_PICKUPS; i++) { if (Lara.Pickups[i] > 0) - m_writer->WriteChunk(m_chunkPickup, &savePuzzle, i, Lara.Pickups[i]); + m_writer->WriteChunk(m_chunkPickup.get(), &savePuzzle, i, Lara.Pickups[i]); } for (int i = 0; i < NUM_PICKUPS * 2; i++) { if (Lara.PickupsCombo[i] > 0) - m_writer->WriteChunk(m_chunkPickupCombo, &savePuzzle, i, Lara.PickupsCombo[i]); + m_writer->WriteChunk(m_chunkPickupCombo.get(), &savePuzzle, i, Lara.PickupsCombo[i]); } for (int i = 0; i < NUM_EXAMINES; i++) { if (Lara.Examines[i] > 0) - m_writer->WriteChunk(m_chunkExamine, &savePuzzle, i, Lara.Examines[i]); + m_writer->WriteChunk(m_chunkExamine.get(), &savePuzzle, i, Lara.Examines[i]); } for (int i = 0; i < NUM_EXAMINES * 2; i++) { if (Lara.ExaminesCombo[i] > 0) - m_writer->WriteChunk(m_chunkExamineCombo, &savePuzzle, i, Lara.ExaminesCombo[i]); + m_writer->WriteChunk(m_chunkExamineCombo.get(), &savePuzzle, i, Lara.ExaminesCombo[i]); } } @@ -338,7 +338,7 @@ void SaveGame::saveVariables() m_luaVariables.clear(); //g_GameScript->GetVariables(&m_luaVariables); for (int i = 0; i < m_luaVariables.size(); i++) - m_writer->WriteChunk(m_chunkLuaVariable, &saveVariable, i, 0); + m_writer->WriteChunk(m_chunkLuaVariable.get(), &saveVariable, i, 0); } void SaveGame::saveVariable(int arg1, int arg2) @@ -408,47 +408,6 @@ void SaveGame::Start() void SaveGame::End() { - delete m_chunkGameStatus; - delete m_chunkItems; - delete m_chunkItem; - delete m_chunkLara; - delete m_chunkLuaVariable; - delete m_chunkStaticFlags; - delete m_chunkVehicle; - delete m_chunkFlipMap; - delete m_chunkFlipStats; - delete m_chunkFlybyFlags; - delete m_chunkSequenceSwitch; - delete m_chunkCdFlags; - delete m_chunkCamera; - delete m_chunkItemDummy; - delete m_chunkStatistics; - delete m_chunkItemAnims; - delete m_chunkItemMeshes; - delete m_chunkItemFlags; - delete m_chunkItemHitPoints; - delete m_chunkItemPosition; - delete m_chunkItemIntelligentData; - delete m_chunkSpecialItemBurningTorch; - delete m_chunkSpecialItemChaff; - delete m_chunkSpecialItemTorpedo; - delete m_chunkSpecialItemCrossbowBolt; - delete m_chunkSpecialItemFlare; - delete m_chunkItemQuadInfo; - delete m_chunkBats; - delete m_chunkRats; - delete m_chunkSpiders; - delete m_chunkLaraExtraInfo; - delete m_chunkWeaponInfo; - delete m_chunkPuzzle; - delete m_chunkKey; - delete m_chunkPickup; - delete m_chunkExamine; - delete m_chunkPuzzleCombo; - delete m_chunkKeyCombo; - delete m_chunkPickupCombo; - delete m_chunkExamineCombo; - delete m_chunkWeaponItem; } bool SaveGame::Save(char* fileName) @@ -469,9 +428,9 @@ bool SaveGame::Save(char* fileName) LEB128::Write(m_stream, ++LastSaveGame); // Now we write chunks - m_writer->WriteChunk(m_chunkStatistics, &saveStatistics, 0, 0); - m_writer->WriteChunkWithChildren(m_chunkGameStatus, &saveGameStatus, 0, 0); - m_writer->WriteChunkWithChildren(m_chunkLara, &saveLara, 0, 0); + m_writer->WriteChunk(m_chunkStatistics.get(), &saveStatistics, 0, 0); + m_writer->WriteChunkWithChildren(m_chunkGameStatus.get(), &saveGameStatus, 0, 0); + m_writer->WriteChunkWithChildren(m_chunkLara.get(), &saveLara, 0, 0); saveItems(); saveVariables(); @@ -632,31 +591,31 @@ bool SaveGame::readVariable() bool SaveGame::readSavegameChunks(ChunkId* chunkId, int maxSize, int arg) { - if (chunkId->EqualsTo(m_chunkGameStatus)) + if (chunkId->EqualsTo(m_chunkGameStatus.get())) return readGameStatus(); - else if (chunkId->EqualsTo(m_chunkLara)) + else if (chunkId->EqualsTo(m_chunkLara.get())) return readLara(); - else if (chunkId->EqualsTo(m_chunkItem)) + else if (chunkId->EqualsTo(m_chunkItem.get())) return readItem(); - else if (chunkId->EqualsTo(m_chunkLuaVariable)) + else if (chunkId->EqualsTo(m_chunkLuaVariable.get())) return readVariable(); - else if (chunkId->EqualsTo(m_chunkStatistics)) + else if (chunkId->EqualsTo(m_chunkStatistics.get())) return readStatistics(); - else if (chunkId->EqualsTo(m_chunkSpecialItemBurningTorch)) + else if (chunkId->EqualsTo(m_chunkSpecialItemBurningTorch.get())) return readBurningTorch(); - else if (chunkId->EqualsTo(m_chunkSpecialItemChaff)) + else if (chunkId->EqualsTo(m_chunkSpecialItemChaff.get())) return readChaff(); - else if (chunkId->EqualsTo(m_chunkSpecialItemTorpedo)) + else if (chunkId->EqualsTo(m_chunkSpecialItemTorpedo.get())) return readTorpedo(); - else if (chunkId->EqualsTo(m_chunkSpecialItemCrossbowBolt)) + else if (chunkId->EqualsTo(m_chunkSpecialItemCrossbowBolt.get())) return readCrossbowBolt(); - else if (chunkId->EqualsTo(m_chunkSpecialItemFlare)) + else if (chunkId->EqualsTo(m_chunkSpecialItemFlare.get())) return readFlare(); - else if (chunkId->EqualsTo(m_chunkBats)) + else if (chunkId->EqualsTo(m_chunkBats.get())) return readBats(); - else if (chunkId->EqualsTo(m_chunkRats)) + else if (chunkId->EqualsTo(m_chunkRats.get())) return readRats(); - else if (chunkId->EqualsTo(m_chunkSpiders)) + else if (chunkId->EqualsTo(m_chunkSpiders.get())) return readSpiders(); return false; @@ -736,7 +695,7 @@ void SaveGame::saveStaticFlag(int arg1, int arg2) bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg) { - if (chunkId->EqualsTo(m_chunkLaraExtraInfo)) + if (chunkId->EqualsTo(m_chunkLaraExtraInfo.get())) { Lara.Binoculars = LEB128::ReadByte(m_stream); Lara.Lasersight = LEB128::ReadByte(m_stream); @@ -754,7 +713,7 @@ bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(m_chunkWeaponInfo)) + else if (chunkId->EqualsTo(m_chunkWeaponInfo.get())) { int id = LEB128::ReadInt32(m_stream); CarriedWeaponInfo* weapon = &Lara.Weapons[id]; @@ -767,55 +726,55 @@ bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg) weapon->HasSilencer = LEB128::ReadByte(m_stream); weapon->HasLasersight = LEB128::ReadByte(m_stream); } - else if (chunkId->EqualsTo(m_chunkPuzzle)) + else if (chunkId->EqualsTo(m_chunkPuzzle.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.Puzzles[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkPuzzleCombo)) + else if (chunkId->EqualsTo(m_chunkPuzzleCombo.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.PuzzlesCombo[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkKey)) + else if (chunkId->EqualsTo(m_chunkKey.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.Keys[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkKeyCombo)) + else if (chunkId->EqualsTo(m_chunkKeyCombo.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.KeysCombo[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkPickup)) + else if (chunkId->EqualsTo(m_chunkPickup.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.Pickups[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkPickupCombo)) + else if (chunkId->EqualsTo(m_chunkPickupCombo.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.PickupsCombo[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkExamine)) + else if (chunkId->EqualsTo(m_chunkExamine.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.Examines[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkExamineCombo)) + else if (chunkId->EqualsTo(m_chunkExamineCombo.get())) { int id = LEB128::ReadInt32(m_stream); int quantity = LEB128::ReadInt32(m_stream); Lara.ExaminesCombo[id] = quantity; } - else if (chunkId->EqualsTo(m_chunkWeaponItem)) + else if (chunkId->EqualsTo(m_chunkWeaponItem.get())) { short weaponItemNum = CreateItem(); Lara.weaponItem = weaponItemNum; @@ -836,7 +795,7 @@ bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg) bool SaveGame::readGameStatusChunks(ChunkId* chunkId, int maxSize, int arg) { - if (chunkId->EqualsTo(m_chunkStaticFlags)) + if (chunkId->EqualsTo(m_chunkStaticFlags.get())) { short roomIndex = LEB128::ReadInt16(m_stream); short staticIndex = LEB128::ReadInt16(m_stream); @@ -858,14 +817,14 @@ bool SaveGame::readGameStatusChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(m_chunkFlipStats)) + else if (chunkId->EqualsTo(m_chunkFlipStats.get())) { short index = LEB128::ReadInt16(m_stream); short value = LEB128::ReadInt16(m_stream); //FlipStats[index] = value; return true; } - else if (chunkId->EqualsTo(m_chunkFlipMap)) + else if (chunkId->EqualsTo(m_chunkFlipMap.get())) { short index = LEB128::ReadInt16(m_stream); short value = LEB128::ReadInt16(m_stream); @@ -874,7 +833,7 @@ bool SaveGame::readGameStatusChunks(ChunkId* chunkId, int maxSize, int arg) DoFlipMap(index); return true; } - else if (chunkId->EqualsTo(m_chunkCdFlags)) + else if (chunkId->EqualsTo(m_chunkCdFlags.get())) { short index = LEB128::ReadInt16(m_stream); printf("Index: %d\n", index); @@ -883,21 +842,21 @@ bool SaveGame::readGameStatusChunks(ChunkId* chunkId, int maxSize, int arg) g_AudioTracks[index].Mask = value; return true; } - else if (chunkId->EqualsTo(m_chunkCamera)) + else if (chunkId->EqualsTo(m_chunkCamera.get())) { short index = LEB128::ReadInt16(m_stream); short value = LEB128::ReadInt16(m_stream); FixedCameras[index].flags = value; return true; } - else if (chunkId->EqualsTo(m_chunkSequenceSwitch)) + else if (chunkId->EqualsTo(m_chunkSequenceSwitch.get())) { short index = LEB128::ReadInt16(m_stream); short value = LEB128::ReadInt16(m_stream); SequenceUsed[index] = value; return true; } - else if (chunkId->EqualsTo(m_chunkFlybyFlags)) + else if (chunkId->EqualsTo(m_chunkFlybyFlags.get())) { int index = LEB128::ReadInt16(m_stream); int value = LEB128::ReadInt16(m_stream); @@ -947,9 +906,9 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) { ITEM_INFO* item = &g_Level.Items[itemNumber]; - if (chunkId->EqualsTo(m_chunkItemDummy)) + if (chunkId->EqualsTo(m_chunkItemDummy.get())) return m_reader->ReadChunkInt32(maxSize); - else if (chunkId->EqualsTo(m_chunkItemAnims)) + else if (chunkId->EqualsTo(m_chunkItemAnims.get())) { item->currentAnimState = LEB128::ReadInt16(m_stream); item->goalAnimState = LEB128::ReadInt16(m_stream); @@ -959,7 +918,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) return true; } - else if (chunkId->EqualsTo(m_chunkItemPosition)) + else if (chunkId->EqualsTo(m_chunkItemPosition.get())) { item->pos.xPos = LEB128::ReadInt32(m_stream); item->pos.yPos = LEB128::ReadInt32(m_stream); @@ -977,13 +936,13 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) return true; } - else if (chunkId->EqualsTo(m_chunkItemHitPoints)) + else if (chunkId->EqualsTo(m_chunkItemHitPoints.get())) { item->hitPoints = LEB128::ReadInt16(m_stream); return true; } - else if (chunkId->EqualsTo(m_chunkItemFlags)) + else if (chunkId->EqualsTo(m_chunkItemFlags.get())) { item->flags = LEB128::ReadInt16(m_stream); byte active = LEB128::ReadByte(m_stream); @@ -1008,7 +967,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) return true; } - else if (chunkId->EqualsTo(m_chunkItemIntelligentData)) + else if (chunkId->EqualsTo(m_chunkItemIntelligentData.get())) { EnableBaddieAI(itemNumber, 1); @@ -1053,7 +1012,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) return true; } - else if (chunkId->EqualsTo(m_chunkItemQuadInfo)) + else if (chunkId->EqualsTo(m_chunkItemQuadInfo.get())) { QUAD_INFO* quadInfo = game_malloc(); m_stream->ReadBytes(reinterpret_cast(quadInfo), sizeof(QUAD_INFO)); @@ -1062,7 +1021,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) return true; } - else if (chunkId->EqualsTo(m_chunkItemMeshes)) + else if (chunkId->EqualsTo(m_chunkItemMeshes.get())) { item->meshBits = LEB128::ReadInt32(m_stream); item->swapMeshFlags = LEB128::ReadInt32(m_stream); diff --git a/TR5Main/Game/savegame.h b/TR5Main/Game/savegame.h index 29051da72..d120912cb 100644 --- a/TR5Main/Game/savegame.h +++ b/TR5Main/Game/savegame.h @@ -69,47 +69,47 @@ private: static ChunkWriter* m_writer; static std::vector m_luaVariables; - static ChunkId* m_chunkGameStatus; - static ChunkId* m_chunkItems; - static ChunkId* m_chunkItem; - static ChunkId* m_chunkLara; - static ChunkId* m_chunkLuaVariable; - static ChunkId* m_chunkStaticFlags; - static ChunkId* m_chunkVehicle; - static ChunkId* m_chunkSequenceSwitch; - static ChunkId* m_chunkFlybyFlags; - static ChunkId* m_chunkCdFlags; - static ChunkId* m_chunkCamera; - static ChunkId* m_chunkFlipStats; - static ChunkId* m_chunkFlipMap; - static ChunkId* m_chunkItemDummy; - static ChunkId* m_chunkStatistics; - static ChunkId* m_chunkItemAnims; - static ChunkId* m_chunkItemMeshes; - static ChunkId* m_chunkItemFlags; - static ChunkId* m_chunkItemHitPoints; - static ChunkId* m_chunkItemPosition; - static ChunkId* m_chunkItemIntelligentData; - static ChunkId* m_chunkSpecialItemBurningTorch; - static ChunkId* m_chunkSpecialItemChaff; - static ChunkId* m_chunkSpecialItemTorpedo; - static ChunkId* m_chunkSpecialItemCrossbowBolt; - static ChunkId* m_chunkSpecialItemFlare; - static ChunkId* m_chunkItemQuadInfo; - static ChunkId* m_chunkRats; - static ChunkId* m_chunkSpiders; - static ChunkId* m_chunkBats; - static ChunkId* m_chunkLaraExtraInfo; - static ChunkId* m_chunkWeaponInfo; - static ChunkId* m_chunkPuzzle; - static ChunkId* m_chunkKey; - static ChunkId* m_chunkPickup; - static ChunkId* m_chunkExamine; - static ChunkId* m_chunkPuzzleCombo; - static ChunkId* m_chunkKeyCombo; - static ChunkId* m_chunkPickupCombo; - static ChunkId* m_chunkExamineCombo; - static ChunkId* m_chunkWeaponItem; + static std::unique_ptr m_chunkGameStatus; + static std::unique_ptr m_chunkItems; + static std::unique_ptr m_chunkItem; + static std::unique_ptr m_chunkLara; + static std::unique_ptr m_chunkLuaVariable; + static std::unique_ptr m_chunkStaticFlags; + static std::unique_ptr m_chunkVehicle; + static std::unique_ptr m_chunkSequenceSwitch; + static std::unique_ptr m_chunkFlybyFlags; + static std::unique_ptr m_chunkCdFlags; + static std::unique_ptr m_chunkCamera; + static std::unique_ptr m_chunkFlipStats; + static std::unique_ptr m_chunkFlipMap; + static std::unique_ptr m_chunkItemDummy; + static std::unique_ptr m_chunkStatistics; + static std::unique_ptr m_chunkItemAnims; + static std::unique_ptr m_chunkItemMeshes; + static std::unique_ptr m_chunkItemFlags; + static std::unique_ptr m_chunkItemHitPoints; + static std::unique_ptr m_chunkItemPosition; + static std::unique_ptr m_chunkItemIntelligentData; + static std::unique_ptr m_chunkSpecialItemBurningTorch; + static std::unique_ptr m_chunkSpecialItemChaff; + static std::unique_ptr m_chunkSpecialItemTorpedo; + static std::unique_ptr m_chunkSpecialItemCrossbowBolt; + static std::unique_ptr m_chunkSpecialItemFlare; + static std::unique_ptr m_chunkItemQuadInfo; + static std::unique_ptr m_chunkRats; + static std::unique_ptr m_chunkSpiders; + static std::unique_ptr m_chunkBats; + static std::unique_ptr m_chunkLaraExtraInfo; + static std::unique_ptr m_chunkWeaponInfo; + static std::unique_ptr m_chunkPuzzle; + static std::unique_ptr m_chunkKey; + static std::unique_ptr m_chunkPickup; + static std::unique_ptr m_chunkExamine; + static std::unique_ptr m_chunkPuzzleCombo; + static std::unique_ptr m_chunkKeyCombo; + static std::unique_ptr m_chunkPickupCombo; + static std::unique_ptr m_chunkExamineCombo; + static std::unique_ptr m_chunkWeaponItem; static void saveGameStatus(int arg1, int arg2); static void saveLara(int arg1, int arg2); diff --git a/TR5Main/Scripting/GameFlowScript.cpp b/TR5Main/Scripting/GameFlowScript.cpp index 4227ddf36..cb6e0670c 100644 --- a/TR5Main/Scripting/GameFlowScript.cpp +++ b/TR5Main/Scripting/GameFlowScript.cpp @@ -8,23 +8,23 @@ #include "draw.h" using std::string; using std::vector; -ChunkId* ChunkGameFlowFlags = ChunkId::FromString("Tr5MainFlags"); -ChunkId* ChunkGameFlowLevel = ChunkId::FromString("Tr5MainLevel"); -ChunkId* ChunkGameFlowLevelFlags = ChunkId::FromString("Tr5MainLevelFlags"); -ChunkId* ChunkGameFlowLevelInfo = ChunkId::FromString("Tr5MainLevelInfo"); -ChunkId* ChunkGameFlowLevelPuzzle = ChunkId::FromString("Tr5MainLevelPuzzle"); -ChunkId* ChunkGameFlowLevelKey = ChunkId::FromString("Tr5MainLevelKey"); -ChunkId* ChunkGameFlowLevelPuzzleCombo = ChunkId::FromString("Tr5MainLevelPuzzleCombo"); -ChunkId* ChunkGameFlowLevelKeyCombo = ChunkId::FromString("Tr5MainLevelKeyCombo"); -ChunkId* ChunkGameFlowLevelPickup = ChunkId::FromString("Tr5MainLevelPickup"); -ChunkId* ChunkGameFlowLevelPickupCombo = ChunkId::FromString("Tr5MainLevelPickupCombo"); -ChunkId* ChunkGameFlowLevelExamine = ChunkId::FromString("Tr5MainLevelExamine"); -ChunkId* ChunkGameFlowLevelLayer = ChunkId::FromString("Tr5MainLevelLayer"); -ChunkId* ChunkGameFlowLevelLuaEvent = ChunkId::FromString("Tr5MainLevelLuaEvent"); -ChunkId* ChunkGameFlowLevelLegend = ChunkId::FromString("Tr5MainLevelLegend"); -ChunkId* ChunkGameFlowStrings = ChunkId::FromString("Tr5MainStrings"); -ChunkId* ChunkGameFlowAudioTracks = ChunkId::FromString("Tr5MainAudioTracks"); -ChunkId* ChunkGameFlowTitleBackground = ChunkId::FromString("Tr5MainTitleBackground"); +std::unique_ptr ChunkGameFlowFlags = ChunkId::FromString("Tr5MainFlags"); +std::unique_ptr ChunkGameFlowLevel = ChunkId::FromString("Tr5MainLevel"); +std::unique_ptr ChunkGameFlowLevelFlags = ChunkId::FromString("Tr5MainLevelFlags"); +std::unique_ptr ChunkGameFlowLevelInfo = ChunkId::FromString("Tr5MainLevelInfo"); +std::unique_ptr ChunkGameFlowLevelPuzzle = ChunkId::FromString("Tr5MainLevelPuzzle"); +std::unique_ptr ChunkGameFlowLevelKey = ChunkId::FromString("Tr5MainLevelKey"); +std::unique_ptr ChunkGameFlowLevelPuzzleCombo = ChunkId::FromString("Tr5MainLevelPuzzleCombo"); +std::unique_ptr ChunkGameFlowLevelKeyCombo = ChunkId::FromString("Tr5MainLevelKeyCombo"); +std::unique_ptr ChunkGameFlowLevelPickup = ChunkId::FromString("Tr5MainLevelPickup"); +std::unique_ptr ChunkGameFlowLevelPickupCombo = ChunkId::FromString("Tr5MainLevelPickupCombo"); +std::unique_ptr ChunkGameFlowLevelExamine = ChunkId::FromString("Tr5MainLevelExamine"); +std::unique_ptr ChunkGameFlowLevelLayer = ChunkId::FromString("Tr5MainLevelLayer"); +std::unique_ptr ChunkGameFlowLevelLuaEvent = ChunkId::FromString("Tr5MainLevelLuaEvent"); +std::unique_ptr ChunkGameFlowLevelLegend = ChunkId::FromString("Tr5MainLevelLegend"); +std::unique_ptr ChunkGameFlowStrings = ChunkId::FromString("Tr5MainStrings"); +std::unique_ptr ChunkGameFlowAudioTracks = ChunkId::FromString("Tr5MainAudioTracks"); +std::unique_ptr ChunkGameFlowTitleBackground = ChunkId::FromString("Tr5MainTitleBackground"); ChunkReader* g_ScriptChunkIO; @@ -163,7 +163,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) { GameScriptLevel* level = g_GameFlow->Levels[arg]; - if (chunkId->EqualsTo(ChunkGameFlowLevelInfo)) + if (chunkId->EqualsTo(ChunkGameFlowLevelInfo.get())) { char* str; @@ -184,7 +184,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelFlags)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelFlags.get())) { level->Horizon = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); level->Sky = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); @@ -200,7 +200,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelPuzzle)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelPuzzle.get())) { int itemIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); int itemStringIndex = LEB128::ReadUInt32(g_ScriptChunkIO->GetRawStream()); @@ -209,7 +209,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelKey)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelKey.get())) { int itemIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); int itemStringIndex = LEB128::ReadUInt32(g_ScriptChunkIO->GetRawStream()); @@ -218,7 +218,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelPickup)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelPickup.get())) { int itemIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); int itemStringIndex = LEB128::ReadUInt32(g_ScriptChunkIO->GetRawStream()); @@ -227,7 +227,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelExamine)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelExamine.get())) { int itemIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); int itemStringIndex = LEB128::ReadUInt32(g_ScriptChunkIO->GetRawStream()); @@ -236,7 +236,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelPuzzleCombo)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelPuzzleCombo.get())) { int itemIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); int piece = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); @@ -246,7 +246,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelKeyCombo)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelKeyCombo.get())) { int itemIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); int piece = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); @@ -256,7 +256,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelPickupCombo)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelPickupCombo.get())) { int itemIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); int piece = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); @@ -266,7 +266,7 @@ bool __cdecl readGameFlowLevelChunks(ChunkId* chunkId, int maxSize, int arg) return true; } - else if (chunkId->EqualsTo(ChunkGameFlowLevelLayer)) + else if (chunkId->EqualsTo(ChunkGameFlowLevelLayer.get())) { int layerIndex = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); @@ -301,13 +301,13 @@ bool __cdecl readGameFlowLevel() bool __cdecl readGameFlowChunks(ChunkId* chunkId, int maxSize, int arg) { - if (chunkId->EqualsTo(ChunkGameFlowFlags)) + if (chunkId->EqualsTo(ChunkGameFlowFlags.get())) return readGameFlowFlags(); - else if (chunkId->EqualsTo(ChunkGameFlowStrings)) + else if (chunkId->EqualsTo(ChunkGameFlowStrings.get())) return readGameFlowStrings(); - else if (chunkId->EqualsTo(ChunkGameFlowAudioTracks)) + else if (chunkId->EqualsTo(ChunkGameFlowAudioTracks.get())) return readGameFlowTracks(); - else if (chunkId->EqualsTo(ChunkGameFlowLevel)) + else if (chunkId->EqualsTo(ChunkGameFlowLevel.get())) return readGameFlowLevel(); return false; } diff --git a/TR5Main/Specific/IO/ChunkId.cpp b/TR5Main/Specific/IO/ChunkId.cpp index bc5ea8e65..fc25450ae 100644 --- a/TR5Main/Specific/IO/ChunkId.cpp +++ b/TR5Main/Specific/IO/ChunkId.cpp @@ -17,19 +17,19 @@ ChunkId::~ChunkId() { delete m_chunkBytes; } -ChunkId* ChunkId::FromString(const char* str) { - return new ChunkId((char*)str, strlen(str)); +std::unique_ptr ChunkId::FromString(const char* str) { + return std::make_unique((char*)str, strlen(str)); } -ChunkId* ChunkId::FromString(string* str) { - return new ChunkId((char*)str->c_str(), str->length()); +std::unique_ptr ChunkId::FromString(string* str) { + return std::make_unique( (char*)str->c_str(), str->length()); } -ChunkId* ChunkId::FromStream(BaseStream* stream) { +std::unique_ptr ChunkId::FromStream(BaseStream* stream) { int idLength = LEB128::ReadInt32(stream); char* buffer = (char*)malloc(idLength); stream->Read(buffer, idLength); - ChunkId* chunk = new ChunkId(buffer, idLength); + std::unique_ptr chunk = std::make_unique(buffer, idLength); free(buffer); return chunk; } diff --git a/TR5Main/Specific/IO/ChunkId.h b/TR5Main/Specific/IO/ChunkId.h index b28ad6d0e..9a8b2bc66 100644 --- a/TR5Main/Specific/IO/ChunkId.h +++ b/TR5Main/Specific/IO/ChunkId.h @@ -1,9 +1,9 @@ #pragma once #include "LEB128.h" #include "Streams.h" +#include - -typedef struct ChunkId +struct ChunkId { private: byte* m_chunkBytes; @@ -14,11 +14,11 @@ public: ~ChunkId(); - static ChunkId* FromString(const char* str); + static std::unique_ptr FromString(const char* str); - static ChunkId* FromString(std::string* str); + static std::unique_ptr FromString(std::string* str); - static ChunkId* FromStream(BaseStream* stream); + static std::unique_ptr FromStream(BaseStream* stream); void ToStream(BaseStream* stream); diff --git a/TR5Main/Specific/IO/ChunkReader.cpp b/TR5Main/Specific/IO/ChunkReader.cpp index f64c32f0f..c9bc26d16 100644 --- a/TR5Main/Specific/IO/ChunkReader.cpp +++ b/TR5Main/Specific/IO/ChunkReader.cpp @@ -42,7 +42,7 @@ bool ChunkReader::IsValid() { bool ChunkReader::ReadChunks(bool(*func)(ChunkId* parentChunkId, int maxSize, int arg), int arg) { do { - ChunkId* chunkId = ChunkId::FromStream(m_stream); + std::unique_ptr chunkId = ChunkId::FromStream(m_stream); if (chunkId->EqualsTo(m_emptyChunk)) // End reached break; @@ -53,7 +53,7 @@ bool ChunkReader::ReadChunks(bool(*func)(ChunkId* parentChunkId, int maxSize, in bool chunkRecognized = false; int startPos = m_stream->GetCurrentPosition(); - chunkRecognized = func(chunkId, chunkSize, arg); + chunkRecognized = func(chunkId.get(), chunkSize, arg); int readDataCount = m_stream->GetCurrentPosition() - startPos; // Adjust _stream position if necessary @@ -66,7 +66,7 @@ bool ChunkReader::ReadChunks(bool(*func)(ChunkId* parentChunkId, int maxSize, in bool ChunkReader::ReadChunks(std::function func, int arg) { do { - ChunkId* chunkId = ChunkId::FromStream(m_stream); + std::unique_ptr chunkId = ChunkId::FromStream(m_stream); if (chunkId->EqualsTo(m_emptyChunk)) // End reached break; @@ -77,7 +77,7 @@ bool ChunkReader::ReadChunks(std::function func, int bool chunkRecognized = false; int startPos = m_stream->GetCurrentPosition(); - chunkRecognized = func(chunkId, chunkSize, arg); + chunkRecognized = func(chunkId.get(), chunkSize, arg); int readDataCount = m_stream->GetCurrentPosition() - startPos; // Adjust _stream position if necessary diff --git a/TR5Main/Specific/winmain.cpp b/TR5Main/Specific/winmain.cpp index 7df623225..d3223bffc 100644 --- a/TR5Main/Specific/winmain.cpp +++ b/TR5Main/Specific/winmain.cpp @@ -185,9 +185,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine // Clear Application Structure memset(&App, 0, sizeof(WINAPP)); - - _CrtSetReportMode(0, 2); - _CrtSetDbgFlag(-1); // Initialise the new scripting system sol::state luaState; From 30f9b1f6539af86cee144e4bce5e05ecb327c3ce Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Sat, 15 Aug 2020 07:27:14 +0200 Subject: [PATCH 16/22] Refactoring weapons; Added new shatter fields to static meshes datat structs; --- TR5Main/Game/collide.cpp | 2 +- TR5Main/Game/control.cpp | 13 +- TR5Main/Game/inventory.cpp | 59 +- TR5Main/Game/lara1gun.cpp | 1028 ++++++++++++++------- TR5Main/Game/lara1gun.h | 11 +- TR5Main/Game/larafire.cpp | 28 +- TR5Main/Game/laramisc.cpp | 14 +- TR5Main/Game/room.h | 1 + TR5Main/Objects/TR5/tr5_objects.cpp | 1 + TR5Main/Renderer/Render11Helper.cpp | 34 +- TR5Main/Renderer/Renderer11DrawEffect.cpp | 6 +- TR5Main/Specific/setup.h | 9 + 12 files changed, 796 insertions(+), 410 deletions(-) diff --git a/TR5Main/Game/collide.cpp b/TR5Main/Game/collide.cpp index 048cae89b..db72053ce 100644 --- a/TR5Main/Game/collide.cpp +++ b/TR5Main/Game/collide.cpp @@ -187,7 +187,7 @@ int GetCollidedObjects(ITEM_INFO* collidingItem, int radius, int onlyVisible, IT { ITEM_INFO* item = &g_Level.Items[itemNumber]; - if (item == collidingItem || !ignoreLara && item == LaraItem) + if (item == collidingItem || ignoreLara && item == LaraItem) { itemNumber = item->nextItem; continue; diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index d644214f3..b582df0b9 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -2152,9 +2152,9 @@ int GetTargetOnLOS(GAME_VECTOR *src, GAME_VECTOR *dest, int DrawTarget, int firi else { item = &g_Level.Items[itemNumber]; - if (item->objectNumber != ID_SHOOT_SWITCH1 && item->objectNumber != ID_SHOOT_SWITCH2) + if (item->objectNumber < ID_SHOOT_SWITCH1 && item->objectNumber > ID_SHOOT_SWITCH4) { - if (Objects[item->objectNumber].explodableMeshbits & ShatterItem.bit && LaserSight) + if ((Objects[item->objectNumber].explodableMeshbits & ShatterItem.bit) && LaserSight) { if (!Objects[item->objectNumber].intelligent) { @@ -2237,10 +2237,17 @@ int GetTargetOnLOS(GAME_VECTOR *src, GAME_VECTOR *dest, int DrawTarget, int firi ExplodeItemNode(item, Objects[item->objectNumber].nmeshes - 1, 0, 64); if (item->triggerFlags == 444 && item->objectNumber == ID_SHOOT_SWITCH2) { + // TR5 ID_SWITCH_TYPE_8/ID_SHOOT_SWITCH2 ProcessExplodingSwitchType8(item); } - else + else { + if (item->objectNumber == ID_SHOOT_SWITCH3) + { + // TR4 ID_SWITCH_TYPE7 + ExplodeItemNode(item, Objects[item->objectNumber].nmeshes - 1, 0, 64); + } + if (item->flags & IFLAG_ACTIVATION_MASK && (item->flags & IFLAG_ACTIVATION_MASK) != IFLAG_ACTIVATION_MASK) { room = item->roomNumber; diff --git a/TR5Main/Game/inventory.cpp b/TR5Main/Game/inventory.cpp index a6c0bee3a..1ad214de2 100644 --- a/TR5Main/Game/inventory.cpp +++ b/TR5Main/Game/inventory.cpp @@ -1565,16 +1565,17 @@ void Inventory::UseCurrentItem() } // TODO: can cause problem with harpoongun in underwater and wading ! - bool canUseWeapons = !(LaraItem->currentAnimState == LS_CRAWL_IDLE || - LaraItem->currentAnimState == LS_CRAWL_FORWARD || - LaraItem->currentAnimState == LS_CRAWL_TURN_LEFT || - LaraItem->currentAnimState == LS_CRAWL_TURN_RIGHT || - LaraItem->currentAnimState == LS_CRAWL_BACK || - LaraItem->currentAnimState == LS_CRAWL_TO_HANG || - LaraItem->currentAnimState == LS_CROUCH_IDLE || - LaraItem->currentAnimState == LS_CROUCH_TURN_LEFT || - LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT || - Lara.waterStatus != LW_ABOVE_WATER); + bool canUseWeapons = (LaraItem->currentAnimState != LS_CRAWL_IDLE && + LaraItem->currentAnimState != LS_CRAWL_FORWARD && + LaraItem->currentAnimState != LS_CRAWL_TURN_LEFT && + LaraItem->currentAnimState != LS_CRAWL_TURN_RIGHT && + LaraItem->currentAnimState != LS_CRAWL_BACK && + LaraItem->currentAnimState != LS_CRAWL_TO_HANG && + LaraItem->currentAnimState != LS_CROUCH_IDLE && + LaraItem->currentAnimState != LS_CROUCH_TURN_LEFT && + LaraItem->currentAnimState != LS_CROUCH_TURN_RIGHT && + (Lara.waterStatus != LW_UNDERWATER + || (Lara.waterStatus == LW_UNDERWATER && objectNumber == ID_HARPOON_ITEM))); // Pistols if (objectNumber == ID_PISTOLS_ITEM) @@ -1709,6 +1710,44 @@ void Inventory::UseCurrentItem() return; } + // Harpoon gun + if (objectNumber == ID_HARPOON_ITEM) + { + if (canUseWeapons) + { + Lara.requestGunType = WEAPON_HARPOON_GUN; + if (!Lara.gunStatus && Lara.gunType == WEAPON_HARPOON_GUN) + Lara.gunStatus = LG_DRAW_GUNS; + + SoundEffect(SFX_MENU_CHOOSE, NULL, 0); + } + else + { + SayNo(); + } + + return; + } + + // Rocket launcher + if (objectNumber == ID_ROCKET_LAUNCHER_ITEM) + { + if (canUseWeapons) + { + Lara.requestGunType = WEAPON_ROCKET_LAUNCHER; + if (!Lara.gunStatus && Lara.gunType == WEAPON_ROCKET_LAUNCHER) + Lara.gunStatus = LG_DRAW_GUNS; + + SoundEffect(SFX_MENU_CHOOSE, NULL, 0); + } + else + { + SayNo(); + } + + return; + } + // HK if (objectNumber == ID_HK_ITEM) { diff --git a/TR5Main/Game/lara1gun.cpp b/TR5Main/Game/lara1gun.cpp index 079acf6df..4b9d0624e 100644 --- a/TR5Main/Game/lara1gun.cpp +++ b/TR5Main/Game/lara1gun.cpp @@ -35,69 +35,100 @@ byte HKFlag2 = 0; void FireHarpoon() { - // If no ammo then exit - //if (Lara.numHarpoonAmmos <= 0) - // return; - - // Create a new item for harpoon - short itemNumber = CreateItem(); - if (itemNumber != NO_ITEM) + short* ammos = GetAmmo(WEAPON_CROSSBOW); + if (*ammos != 0) { - GAME_VECTOR pos; - PHD_VECTOR handr; - ITEM_INFO* item = &g_Level.Items[itemNumber]; + Lara.hasFired = true; - item->shade = 0x4210 | 0x8000; - item->objectNumber = ID_HARPOON; - item->roomNumber = LaraItem->roomNumber; - - handr.x = -2; - handr.y = 0; - handr.z = 77; - GetLaraJointPosition(&handr, LM_RHAND); - pos.x = handr.z; - pos.y = handr.y; - pos.z = handr.z; - item->pos.xPos = pos.x; - item->pos.yPos = pos.y; - item->pos.zPos = pos.z; - - InitialiseItem(itemNumber); - - if (Lara.target != nullptr) + // Create a new item for harpoon + short itemNumber = CreateItem(); + if (itemNumber != NO_ITEM) { - find_target_point(Lara.target, &pos); - item->pos.yRot = phd_atan(pos.z - item->pos.zPos, pos.x - item->pos.xPos); - int distance = sqrt(SQUARE(pos.z - item->pos.zPos) + SQUARE(pos.x - item->pos.xPos)); - item->pos.xRot = -phd_atan(distance, pos.y - item->pos.yPos); + if (*ammos != -1) + (*ammos)--; + + GAME_VECTOR pos; + ITEM_INFO* item = &g_Level.Items[itemNumber]; + + item->shade = 0x4210 | 0x8000; + item->objectNumber = ID_HARPOON; + item->roomNumber = LaraItem->roomNumber; + + PHD_VECTOR jointPos; + + jointPos.x = -2; + jointPos.y = 0; + jointPos.z = 77; + + GetLaraJointPosition(&jointPos, LM_LHAND); + + FLOOR_INFO* floor = GetFloor(jointPos.x, jointPos.y, jointPos.z, &item->roomNumber); + int height = GetFloorHeight(floor, jointPos.x, jointPos.y, jointPos.z); + + if (height >= jointPos.y) + { + item->pos.xPos = jointPos.x; + item->pos.yPos = jointPos.y; + item->pos.zPos = jointPos.z; + } + else + { + item->pos.xPos = LaraItem->pos.xPos; + item->pos.yPos = jointPos.y; + item->pos.zPos = LaraItem->pos.zPos; + item->roomNumber = LaraItem->roomNumber; + } + + InitialiseItem(itemNumber); + + /*if (Lara.target != nullptr) + { + find_target_point(Lara.target, &pos); + item->pos.yRot = phd_atan(pos.z - item->pos.zPos, pos.x - item->pos.xPos); + int distance = sqrt(SQUARE(pos.z - item->pos.zPos) + SQUARE(pos.x - item->pos.xPos)); + item->pos.xRot = -phd_atan(distance, pos.y - item->pos.yPos); + } + else + { + item->pos.xRot = LaraItem->pos.xRot + Lara.torsoXrot; + item->pos.yRot = LaraItem->pos.yRot + Lara.torsoYrot; + }*/ + + item->pos.xRot = Lara.leftArm.xRot + LaraItem->pos.xRot; + item->pos.zRot = 0; + item->pos.yRot = Lara.leftArm.yRot + LaraItem->pos.yRot; + + if (!Lara.leftArm.lock) + { + item->pos.xRot += Lara.torsoXrot; + item->pos.yRot += Lara.torsoYrot; + } + + item->pos.zRot = 0; + + item->fallspeed = (short)(-HARPOON_SPEED * phd_sin(item->pos.xRot) >> W2V_SHIFT); + item->speed = (short)(HARPOON_SPEED * phd_cos(item->pos.xRot) >> W2V_SHIFT); + item->hitPoints = HARPOON_TIME; + + AddActiveItem(itemNumber); + + Savegame.Level.AmmoUsed++; + Savegame.Game.AmmoUsed++; } - else - { - item->pos.xRot = LaraItem->pos.xRot + Lara.torsoXrot; - item->pos.yRot = LaraItem->pos.yRot + Lara.torsoYrot; - } - - item->pos.zRot = 0; - - item->fallspeed = (short)(-HARPOON_SPEED * phd_sin(item->pos.xRot) >> W2V_SHIFT); - item->speed = (short)(HARPOON_SPEED * phd_cos(item->pos.xRot) >> W2V_SHIFT); - item->hitPoints = HARPOON_TIME; - - AddActiveItem(itemNumber); - - Savegame.Level.AmmoUsed++; - Savegame.Game.AmmoUsed++; } } void ControlHarpoonBolt(short itemNumber) { - ITEM_INFO* item = &g_Level.Items[itemNumber]; + /*ITEM_INFO* item = &g_Level.Items[itemNumber]; + + // Store position for later int oldX = item->pos.xPos; int oldY = item->pos.yPos; int oldZ = item->pos.zPos; short oldRoom = item->roomNumber; + // Update position item->pos.xPos += item->speed * phd_sin(item->pos.yRot) >> W2V_SHIFT; item->pos.yPos += item->fallspeed; item->pos.zPos += item->speed * phd_cos(item->pos.yRot) >> W2V_SHIFT; @@ -106,6 +137,7 @@ void ControlHarpoonBolt(short itemNumber) FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); item->floor = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); + // Has harpoon changed room? if (item->roomNumber != roomNumber) ItemNewRoom(itemNumber, roomNumber); @@ -147,7 +179,7 @@ void ControlHarpoonBolt(short itemNumber) continue; // TODO: - /*if (target->objectNumber == SMASH_OBJECT1 && CurrentLevel != LV_CRASH) + if (target->objectNumber == SMASH_OBJECT1 && CurrentLevel != LV_CRASH) { SmashWindow(targetItemNumber); } @@ -166,7 +198,7 @@ void ControlHarpoonBolt(short itemNumber) } } else if (target->objectNumber != SMASH_OBJECT1) - {*/ + { if (Objects[target->objectNumber].intelligent) { DoLotsOfBlood(item->pos.xPos, item->pos.yPos, item->pos.zPos, 0, 0, item->roomNumber, 3); @@ -178,7 +210,7 @@ void ControlHarpoonBolt(short itemNumber) KillItem(itemNumber); item->afterDeath = 0; return; - } + } } // Has harpoon hit a wall? @@ -230,8 +262,164 @@ void ControlHarpoonBolt(short itemNumber) roomNumber = item->roomNumber; floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); + if (item->roomNumber != roomNumber) + ItemNewRoom(itemNumber, roomNumber);*/ + + ITEM_INFO* item = &g_Level.Items[itemNumber]; + + // Store old position for later + int oldX = item->pos.xPos; + int oldY = item->pos.yPos; + int oldZ = item->pos.zPos; + short roomNumber = item->roomNumber; + + bool aboveWater = false; + + // Update speed and check if above water + item->pos.zRot += ANGLE(35); + if (!(g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER)) + { + item->pos.xRot -= ANGLE(1); + if (item->pos.xRot < -16384) + item->pos.xRot = -16384; + item->fallspeed = (short)(-HARPOON_SPEED * phd_sin(item->pos.xRot) >> W2V_SHIFT); + item->speed = (short)(HARPOON_SPEED * phd_cos(item->pos.xRot) >> W2V_SHIFT); + aboveWater = true; + } + else + { + // Create bubbles + if ((Wibble & 15) == 0) + CreateBubble((PHD_VECTOR*)& item->pos, item->roomNumber, 0, 0, BUBBLE_FLAG_CLUMP | BUBBLE_FLAG_HIGH_AMPLITUDE, 0, 0, 0); // CHECK + //TriggerRocketSmoke(item->pos.xPos, item->pos.yPos, item->pos.zPos, 64); + item->fallspeed = (short)(-(HARPOON_SPEED >> 1) * phd_sin(item->pos.xRot) >> W2V_SHIFT); + item->speed = (short)((HARPOON_SPEED >> 1) * phd_cos(item->pos.xRot) >> W2V_SHIFT); + aboveWater = false; + } + + // Update bolt's position + item->pos.xPos += ((item->speed * phd_cos(item->pos.xRot) >> W2V_SHIFT) * phd_sin(item->pos.yRot)) >> W2V_SHIFT; + item->pos.yPos += item->speed * phd_sin(-item->pos.xRot) >> W2V_SHIFT; + item->pos.zPos += ((item->speed * phd_cos(item->pos.xRot) >> W2V_SHIFT) * phd_cos(item->pos.yRot)) >> W2V_SHIFT; + + roomNumber = item->roomNumber; + FLOOR_INFO * floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); + + // Check if bolt has hit a solid wall + if (GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) < item->pos.yPos || + GetCeiling(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) > item->pos.yPos) + { + // I have hit a solid wall, this is the end for the bolt + item->pos.xPos = oldX; + item->pos.yPos = oldY; + item->pos.zPos = oldZ; + + ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL); + KillItem(itemNumber); + return; + } + + // Has harpoon changed room? if (item->roomNumber != roomNumber) ItemNewRoom(itemNumber, roomNumber); + + // If now in water and before in land, add a ripple + if ((g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) && aboveWater) + { + SetupRipple(item->pos.xPos, g_Level.Rooms[item->roomNumber].minfloor, item->pos.zPos, (GetRandomControl() & 7) + 8, 0); + } + + int n = 0; + bool foundCollidedObjects = false; + + // Found possible collided items and statics + GetCollidedObjects(item, HARPOON_HIT_RADIUS, 1, &CollidedItems[0], &CollidedMeshes[0], 1); + + // If no collided items and meshes are found, then exit the loop + if (!CollidedItems[0] && !CollidedMeshes[0]) + return; + + foundCollidedObjects = true; + + if (CollidedItems[0]) + { + ITEM_INFO* currentItem = CollidedItems[0]; + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + + int k = 0; + do + { + if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) + || currentItem->objectNumber == ID_LARA + || (currentItem->flags & 0x40 && + (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem))) + { + // All active intelligent creatures explode, if their HP is <= 0 + // Explosion is handled by CreatureDie() + // Also Lara can be damaged + // HitTarget() is called inside this + DoExplosiveDamageOnBaddie(currentItem, item, WEAPON_CROSSBOW); + } + else if (currentItem->objectNumber >= ID_SMASH_OBJECT1 && currentItem->objectNumber <= ID_SMASH_OBJECT8) + { + // Smash objects are legacy objects from TRC, let's make them explode in the legacy way + TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); + TriggerShockwave(&PHD_3DPOS(currentItem->pos.xPos, currentItem->pos.yPos - 128, currentItem->pos.zPos), 48, 304, 96, 0, 96, 128, 24, 0, 0); + ExplodeItemNode(currentItem, 0, 0, 128); + short currentItemNumber = (currentItem - CollidedItems[0]); + SmashObject(currentItemNumber); + KillItem(currentItemNumber); + } + // TODO_LUA: we need to handle it with an event like OnDestroy + /*else if (currentObj->hitEffect == HIT_SPECIAL) + { + // Some objects need a custom behaviour + //HitSpecial(item, currentItem, 1); + }*/ + + // All other items (like puzzles) don't explode + + k++; + currentItem = CollidedItems[k]; + + } while (currentItem); + } + + if (CollidedMeshes[0]) + { + MESH_INFO* currentMesh = CollidedMeshes[0]; + int k = 0; + + do + { + STATIC_INFO* s = &StaticObjects[currentMesh->staticNumber]; + if (s->shatterType != SHT_NONE) + { + currentMesh->hitPoints -= Weapons[WEAPON_CROSSBOW].damage; + if (currentMesh->hitPoints <= 0) + { + TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber); + TriggerShockwave(&PHD_3DPOS(currentMesh->x, currentMesh->y - 128, currentMesh->z, 0, currentMesh->yRot, 0), 40, 176, 64, 0, 96, 128, 16, 0, 0); + ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0); // TODO: this wont work !! + SmashedMeshRoom[SmashedMeshCount] = item->roomNumber; + SmashedMesh[SmashedMeshCount] = currentMesh; + SmashedMeshCount++; + currentMesh->flags &= ~1; + } + } + + k++; + currentMesh = CollidedMeshes[k]; + + } while (currentMesh); + } + + // If harpoon has hit some objects then shatter itself + if (foundCollidedObjects) + { + ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL); + KillItem(itemNumber); + } } long tbx, tby, tbz; @@ -243,7 +431,7 @@ void FireGrenade() int z = 0; short* ammo = GetAmmo(WEAPON_GRENADE_LAUNCHER); - if (*ammo) + if (*ammo != 0) { Lara.hasFired = true; @@ -348,7 +536,6 @@ void ControlGrenade(short itemNumber) if (item->itemFlags[0] == GRENADE_FLASH) { // Flash grenades - if (item->itemFlags[1] == 1) { WeaponEnemyTimer = 120; @@ -369,8 +556,8 @@ void ControlGrenade(short itemNumber) } else { + // Trigger a new grenade in the case of GRENADE_SUPER until itemFlags[1] is > 0 short newGrenadeItemNumber = CreateItem(); - if (newGrenadeItemNumber != NO_ITEM) { ITEM_INFO* newGrenade = &g_Level.Items[newGrenadeItemNumber]; @@ -412,6 +599,7 @@ void ControlGrenade(short itemNumber) return; } + // Store old position for later int oldX = item->pos.xPos; int oldY = item->pos.yPos; int oldZ = item->pos.zPos; @@ -422,6 +610,7 @@ void ControlGrenade(short itemNumber) item->shade = 0xC210; + // Check if above water and update speed and fallspeed bool aboveWater = false; if (g_Level.Rooms[item->roomNumber].flags & 1) { @@ -452,6 +641,7 @@ void ControlGrenade(short itemNumber) } } + // Trigger fire and smoke sparks in the direction of motion if (item->speed && aboveWater) { Matrix world = Matrix::CreateFromYawPitchRoll( @@ -468,6 +658,7 @@ void ControlGrenade(short itemNumber) TriggerRocketFire(wx + item->pos.xPos, wy + item->pos.yPos, wz + item->pos.zPos); } + // Update grenade position xv = ((item->speed * phd_sin(item->goalAnimState)) >> W2V_SHIFT); yv = item->fallspeed; zv = ((item->speed * phd_cos(item->goalAnimState)) >> W2V_SHIFT); @@ -481,6 +672,7 @@ void ControlGrenade(short itemNumber) int ceiling; short roomNumber; + // Never implemented in original game if (item->itemFlags[0] == GRENADE_ULTRA) { roomNumber = item->roomNumber; @@ -494,6 +686,7 @@ void ControlGrenade(short itemNumber) } else { + // Do grenade's physics short sYrot = item->pos.yRot; item->pos.yRot = item->goalAnimState; @@ -506,37 +699,10 @@ void ControlGrenade(short itemNumber) roomNumber = item->roomNumber; floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); - if ((g_Level.Rooms[roomNumber].flags & ENV_FLAG_WATER) && aboveWater) - { - // Setup splash - /*dword_804E20 = item->pos.xPos; - dword_804E24 = *(Rooms + 148 * v78 + 36); - dword_804E28 = item->pos.zPos; - word_804E2C = 32; - word_804E2E = 8; - word_804E30 = 320; - v45 = item->fallSpeed; - word_804E34 = 48; - word_804E32 = -40 * v45; - word_804E36 = 32; - word_804E38 = 480; - word_804E3A = -20 * item->fallSpeed; - word_804E3C = 32; - word_804E3E = 128; - word_804E40 = 544; - sub_435380(&dword_804E20); - if ( item->itemFlags[0] != 4 ) - { - goto LABEL_35; - } - item->hitPoints = 1;*/ - // what is this lol - } - if (item->itemFlags[0] == GRENADE_ULTRA) GrenadeLauncherSpecialEffect1(item->pos.xPos, item->pos.yPos, item->pos.zPos, -1, 1); - // Time to explode? + // Check if it's time to explode int radius = 0; bool explode = false; @@ -558,6 +724,7 @@ void ControlGrenade(short itemNumber) } } + // If is not a flash grenade then try to destroy surrounding objects if (!(item->itemFlags[0] == GRENADE_FLASH && explode)) { int n = 0; @@ -581,66 +748,40 @@ void ControlGrenade(short itemNumber) if (explode) { ITEM_INFO* currentItem = CollidedItems[0]; - int k = 0; + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + int k = 0; do { - // Item is inside the radius and must explode - if (item->objectNumber < ID_SMASH_OBJECT1 || item->objectNumber > ID_SMASH_OBJECT8 || (currentItem->flags & 0x40)) + if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) + || currentItem->objectNumber == ID_LARA + || (currentItem->flags & 0x40 && + (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem))) { - if (currentItem->objectNumber != ID_SHOOT_SWITCH1 && - currentItem->objectNumber != ID_SHOOT_SWITCH2 || - currentItem->flags & 0x40 && - (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem)) - { - DoGrenadeDamageOnBaddie(currentItem, item); - } - else - { - if (currentItem->flags & 0x3E00 && (currentItem->flags & 0x3E00) != 0x3E00) - { - roomNumber = item->roomNumber; - floor = GetFloor(currentItem->pos.xPos, currentItem->pos.yPos - 256, currentItem->pos.zPos, &roomNumber); - GetFloorHeight(floor, currentItem->pos.xPos, currentItem->pos.yPos - 256, currentItem->pos.zPos); - TestTriggers(TriggerIndex, 1, currentItem->flags & 0x3E00); - } - else - { - short itemNos[8]; - int sw = GetSwitchTrigger(currentItem, itemNos, 1); - - if (sw > 0) - { - for (int i = 0; i < sw; i++) - { - AddActiveItem(itemNos[i]); - g_Level.Items[itemNos[i]].status = ITEM_ACTIVE; - g_Level.Items[itemNos[i]].triggerFlags |= 0x3E00; - } - } - } - } - - if (currentItem->objectNumber == ID_SHOOT_SWITCH1) - { - ExplodeItemNode(currentItem, Objects[ID_SHOOT_SWITCH1].nmeshes - 1, 0, 64); - } - - AddActiveItem((currentItem - g_Level.Items.data())); - currentItem->status = ITEM_ACTIVE; - currentItem->triggerFlags |= 0x3E40; + // All active intelligent creatures explode, if their HP is <= 0 + // Explosion is handled by CreatureDie() + // Also Lara can be damaged + // HitTarget() is called inside this + DoExplosiveDamageOnBaddie(currentItem, item, WEAPON_GRENADE_LAUNCHER); } - else + else if (currentItem->objectNumber >= ID_SMASH_OBJECT1 && currentItem->objectNumber <= ID_SMASH_OBJECT8) { + // Smash objects are legacy objects from TRC, let's make them explode in the legacy way TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); - currentItem->pos.yPos -= 128; - TriggerShockwave(¤tItem->pos, 48, 304, 64, 0, 96, 128, 24, 0, 0); - currentItem->pos.yPos += 128; + TriggerShockwave(&PHD_3DPOS(currentItem->pos.xPos, currentItem->pos.yPos - 128, currentItem->pos.zPos), 48, 304, 96, 0, 96, 128, 24, 0, 0); ExplodeItemNode(currentItem, 0, 0, 128); - short currentItemNumber = (currentItem - g_Level.Items.data()); + short currentItemNumber = (currentItem - CollidedItems[0]); SmashObject(currentItemNumber); KillItem(currentItemNumber); } + // TODO_LUA: we need to handle it with an event like OnDestroy + /*else if (currentObj->hitEffect == HIT_SPECIAL) + { + // Some objects need a custom behaviour + //HitSpecial(item, currentItem, 1); + }*/ + + // All other items (like puzzles) don't explode k++; currentItem = CollidedItems[k]; @@ -655,17 +796,20 @@ void ControlGrenade(short itemNumber) do { - if (currentMesh->staticNumber >= 50 && currentMesh->staticNumber < 58) + STATIC_INFO* s = &StaticObjects[currentMesh->staticNumber]; + if (s->shatterType != SHT_NONE) { - TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber); - currentMesh->y -= 128; - //TriggerShockwave((PHD_3DPOS*)¤tMesh, 40, 176, 64, 0, 96, 128, 16, 0, 0); - currentMesh->y += 128; - ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0); - SmashedMeshRoom[SmashedMeshCount] = item->roomNumber; - SmashedMesh[SmashedMeshCount] = currentMesh; - SmashedMeshCount++; - currentMesh->flags &= ~1; + currentMesh->hitPoints -= Weapons[WEAPON_GRENADE_LAUNCHER].damage; + if (currentMesh->hitPoints <= 0) + { + TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber); + TriggerShockwave(&PHD_3DPOS(currentMesh->x, currentMesh->y - 128, currentMesh->z, 0, currentMesh->yRot, 0), 40, 176, 64, 0, 96, 128, 16, 0, 0); + ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0); // TODO: this wont work !! + SmashedMeshRoom[SmashedMeshCount] = item->roomNumber; + SmashedMesh[SmashedMeshCount] = currentMesh; + SmashedMeshCount++; + currentMesh->flags &= ~1; + } } k++; @@ -682,6 +826,7 @@ void ControlGrenade(short itemNumber) } while (n < 2); } + // Handle explosion effects if (explode || (item->itemFlags[0] == GRENADE_FLASH && explode)) { if (item->itemFlags[0] == GRENADE_FLASH) @@ -709,10 +854,12 @@ void ControlGrenade(short itemNumber) } AlertNearbyGuards(item); - SoundEffect(105, &item->pos, PITCH_SHIFT | 0x1800000); - SoundEffect(106, &item->pos, 0); - if (item->itemFlags[0] != GRENADE_NORMAL && item->itemFlags[0] != 4) + SoundEffect(SFX_EXPLOSION1, &item->pos, PITCH_SHIFT | 0x1800000); + SoundEffect(SFX_EXPLOSION2, &item->pos, 0); + + // Setup the counter for spawned grenades in the case of flash and super grenades ammos + if (item->itemFlags[0] != GRENADE_NORMAL && item->itemFlags[0] != GRENADE_ULTRA) { item->meshBits = 0; item->itemFlags[1] = (item->itemFlags[0] != GRENADE_SUPER ? 16 : 4); @@ -724,6 +871,202 @@ void ControlGrenade(short itemNumber) } } +void ControlRocket(short itemNumber) +{ + ITEM_INFO* item = &g_Level.Items[itemNumber]; + + // Save old position for later + short oldroom = item->roomNumber; + int oldx = item->pos.xPos; + int oldy = item->pos.yPos; + int oldz = item->pos.zPos; + + // Update speed and rotation and check if above water or underwater + bool abovewater = false; + if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) + { + if (item->speed > ROCKET_SPEED / 4) + item->speed -= (item->speed / 4); + else + { + item->speed += (item->speed / 4) + 4; + if (item->speed > ROCKET_SPEED / 4) + item->speed = ROCKET_SPEED / 4; + } + + item->pos.zRot += (((item->speed / 8) + 3) * ANGLE(1)); + abovewater = false; + } + else + { + if (item->speed < ROCKET_SPEED) + item->speed += (item->speed / 4) + 4; + item->pos.zRot += (((item->speed / 4) + 7) * ANGLE(1)); + abovewater = true; + } + + item->shade = 0x4210 | 0x8000; + + // Calculate offset in rocket direction for fire and smoke sparks + Matrix world = Matrix::CreateFromYawPitchRoll( + TO_RAD(item->pos.yRot - ANGLE(180)), + TO_RAD(item->pos.xRot), + TO_RAD(item->pos.zRot) + ) * Matrix::CreateTranslation(0, 0, -64); + + int wx = world.Translation().x; + int wy = world.Translation().y; + int wz = world.Translation().z; + + // Trigger fire, smoke and lighting + TriggerRocketSmoke(wx + item->pos.xPos, wy + item->pos.yPos, wz + item->pos.zPos, -1); + TriggerRocketFire(wx + item->pos.xPos, wy + item->pos.yPos, wz + item->pos.zPos); + TriggerDynamicLight(wx + item->pos.xPos + (GetRandomControl() & 15) - 8, wy + item->pos.yPos + (GetRandomControl() & 15) - 8, wz + item->pos.zPos + (GetRandomControl() & 15) - 8, 14, 28 + (GetRandomControl() & 3), 16 + (GetRandomControl() & 7), (GetRandomControl() & 7)); + + // If underwater generate bubbles + if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) + { + PHD_VECTOR pos; + pos.x = wx + item->pos.xPos; + pos.y = wy + item->pos.yPos; + pos.z = wz + item->pos.zPos; + CreateBubble(&pos, item->roomNumber, 4, 8, 0, 0, 0, 0); + } + + // Update rocket's position + short speed = (item->speed * phd_cos(item->pos.xRot)) >> W2V_SHIFT; + item->pos.xPos += (speed * phd_sin(item->pos.yRot)) >> W2V_SHIFT; + item->pos.yPos += -((item->speed * phd_sin(item->pos.xRot)) >> W2V_SHIFT); + item->pos.zPos += (speed * phd_cos(item->pos.yRot)) >> W2V_SHIFT; + + bool explode = false; + + // Check if solid wall and then decide if explode or not + short roomNumber = item->roomNumber; + FLOOR_INFO * floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); + if (GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) < item->pos.yPos || + GetCeiling(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) > item->pos.yPos) + { + item->pos.xPos = oldx; + item->pos.yPos = oldy; + item->pos.zPos = oldz; + explode = true; + } + + // Has bolt changed room? + if (item->roomNumber != roomNumber) + ItemNewRoom(itemNumber, roomNumber); + + // If now in water and before in land, add a ripple + if ((g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) && abovewater) + SetupRipple(item->pos.xPos, g_Level.Rooms[item->roomNumber].minfloor, item->pos.zPos, (GetRandomControl() & 7) + 8, 0); + + // Search for possible collided items and statics + GetCollidedObjects(item, ROCKET_EXPLODE_RADIUS, 1, &CollidedItems[0], &CollidedMeshes[0], 1); + + // If no collided items and meshes are found, then exit the loop + if (CollidedItems[0] || CollidedMeshes[0]) + { + explode = true; + + if (CollidedItems[0]) + { + ITEM_INFO* currentItem = CollidedItems[0]; + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + + int k = 0; + do + { + if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) + || currentItem->objectNumber == ID_LARA + || (currentItem->flags & 0x40 && + (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem))) + { + // All active intelligent creatures explode, if their HP is <= 0 + // Explosion is handled by CreatureDie() + // Also Lara can be damaged + // HitTarget() is called inside this + DoExplosiveDamageOnBaddie(currentItem, item, WEAPON_ROCKET_LAUNCHER); + } + else if (currentItem->objectNumber >= ID_SMASH_OBJECT1 && currentItem->objectNumber <= ID_SMASH_OBJECT8) + { + // Smash objects are legacy objects from TRC, let's make them explode in the legacy way + TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); + TriggerShockwave(&PHD_3DPOS(currentItem->pos.xPos, currentItem->pos.yPos - 128, currentItem->pos.zPos), 48, 304, 96, 0, 96, 128, 24, 0, 0); + ExplodeItemNode(currentItem, 0, 0, 128); + short currentItemNumber = (currentItem - CollidedItems[0]); + SmashObject(currentItemNumber); + KillItem(currentItemNumber); + } + // TODO_LUA: we need to handle it with an event like OnDestroy + /*else if (currentObj->hitEffect == HIT_SPECIAL) + { + // Some objects need a custom behaviour + //HitSpecial(item, currentItem, 1); + }*/ + + // All other items (like puzzles) don't explode + + k++; + currentItem = CollidedItems[k]; + + } while (currentItem); + } + + if (CollidedMeshes[0]) + { + MESH_INFO* currentMesh = CollidedMeshes[0]; + int k = 0; + + do + { + STATIC_INFO* s = &StaticObjects[currentMesh->staticNumber]; + if (s->shatterType != SHT_NONE) + { + currentMesh->hitPoints -= ROCKET_DAMAGE; + if (currentMesh->hitPoints <= 0) + { + TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber); + TriggerShockwave(&PHD_3DPOS(currentMesh->x, currentMesh->y - 128, currentMesh->z, 0, currentMesh->yRot, 0), 40, 176, 64, 0, 96, 128, 16, 0, 0); + ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0); // TODO: this wont work !! + SmashedMeshRoom[SmashedMeshCount] = item->roomNumber; + SmashedMesh[SmashedMeshCount] = currentMesh; + SmashedMeshCount++; + currentMesh->flags &= ~1; + } + } + + k++; + currentMesh = CollidedMeshes[k]; + + } while (currentMesh); + } + } + + // Do explosion if needed + if (explode) + { + if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) + TriggerUnderwaterExplosion(item, 0); + else + { + TriggerShockwave(&item->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0); + item->pos.yPos += 128; + TriggerExplosionSparks(oldx, oldy, oldz, 3, -2, 0, item->roomNumber); + for (int j = 0; j < 2; j++) + TriggerExplosionSparks(oldx, oldy, oldz, 3, -1, 0, item->roomNumber); + } + + AlertNearbyGuards(item); + + SoundEffect(SFX_EXPLOSION1, &item->pos, PITCH_SHIFT | 0x1800000); + SoundEffect(SFX_EXPLOSION2, &item->pos, 0); + + ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL); + KillItem(itemNumber); + } +} + void draw_shotgun(int weaponType) { ITEM_INFO* item; @@ -873,7 +1216,7 @@ void AnimateShotgun(int weaponType) } else if (weaponType == WEAPON_ROCKET_LAUNCHER) { - //FireRocket(); + FireRocket(); } else if (weaponType == WEAPON_GRENADE_LAUNCHER) { @@ -1019,14 +1362,16 @@ void ControlCrossbowBolt(short itemNumber) { ITEM_INFO* item = &g_Level.Items[itemNumber]; + // Store old position for later int oldX = item->pos.xPos; int oldY = item->pos.yPos; int oldZ = item->pos.zPos; short roomNumber = item->roomNumber; - bool land = false; + bool aboveWater = false; bool explode = false; + // Update speed and check if above water if (g_Level.Rooms[roomNumber].flags & ENV_FLAG_WATER) { PHD_VECTOR bubblePos(item->pos.xPos, item->pos.yPos, item->pos.zPos); @@ -1034,12 +1379,14 @@ void ControlCrossbowBolt(short itemNumber) item->speed -= (item->speed >> 4); if (GlobalCounter & 1) CreateBubble(&bubblePos, roomNumber, 4, 7, 0, 0, 0, 0); + aboveWater = false; } else { - land = true; + aboveWater = true; } + // Update bolt's position item->pos.xPos += ((item->speed * phd_cos(item->pos.xRot) >> W2V_SHIFT) * phd_sin(item->pos.yRot)) >> W2V_SHIFT; item->pos.yPos += item->speed * phd_sin(-item->pos.xRot) >> W2V_SHIFT; item->pos.zPos += ((item->speed * phd_cos(item->pos.xRot) >> W2V_SHIFT) * phd_cos(item->pos.yRot)) >> W2V_SHIFT; @@ -1047,6 +1394,7 @@ void ControlCrossbowBolt(short itemNumber) roomNumber = item->roomNumber; FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); + // Check if bolt has hit a solid wall if (GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) < item->pos.yPos || GetCeiling(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos) > item->pos.yPos) { @@ -1074,9 +1422,8 @@ void ControlCrossbowBolt(short itemNumber) ItemNewRoom(itemNumber, roomNumber); // If now in water and before in land, add a ripple - if ((g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) && land) + if ((g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) && aboveWater) { - SetupRipple(item->pos.xPos, g_Level.Rooms[item->roomNumber].minfloor, item->pos.zPos, (GetRandomControl() & 7) + 8, 0); } @@ -1101,44 +1448,40 @@ void ControlCrossbowBolt(short itemNumber) if (CollidedItems[0]) { ITEM_INFO* currentItem = CollidedItems[0]; - int k = 0; + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + int k = 0; do { - if (explode) + if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) + || currentItem->objectNumber == ID_LARA + || (currentItem->flags & 0x40 && + (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem))) { - // Item is inside the radius and must explode - if (item->objectNumber < ID_SMASH_OBJECT1 || item->objectNumber > ID_SMASH_OBJECT8) - { - if (currentItem->objectNumber == ID_SHOOT_SWITCH1 || currentItem->objectNumber == ID_SHOOT_SWITCH2) - DoCrossbowDamage(item, currentItem, 0); - else if (Objects[item->objectNumber].hitEffect) - DoGrenadeDamageOnBaddie(currentItem, item); - } - else - { - TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); - TriggerShockwave(&PHD_3DPOS(currentItem->pos.xPos, currentItem->pos.yPos - 128, currentItem->pos.zPos), 48, 304, 96, 0, 96, 128, 24, 0, 0); - ExplodeItemNode(currentItem, 0, 0, 128); - short currentItemNumber = (currentItem - CollidedItems[0]); - SmashObject(currentItemNumber); - KillItem(currentItemNumber); - } + // All active intelligent creatures explode, if their HP is <= 0 + // Explosion is handled by CreatureDie() + // Also Lara can be damaged + // HitTarget() is called inside this + DoExplosiveDamageOnBaddie(currentItem, item, WEAPON_CROSSBOW); } - else if (currentItem->objectNumber == ID_SHOOT_SWITCH1 || currentItem->objectNumber == ID_SHOOT_SWITCH2) + else if (currentItem->objectNumber >= ID_SMASH_OBJECT1 && currentItem->objectNumber <= ID_SMASH_OBJECT8) { - // Special case for ID_SWITCH_TYPE7 and ID_SWITCH_TYPE8 - DoCrossbowDamage(item, currentItem, 1); + // Smash objects are legacy objects from TRC, let's make them explode in the legacy way + TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); + TriggerShockwave(&PHD_3DPOS(currentItem->pos.xPos, currentItem->pos.yPos - 128, currentItem->pos.zPos), 48, 304, 96, 0, 96, 128, 24, 0, 0); + ExplodeItemNode(currentItem, 0, 0, 128); + short currentItemNumber = (currentItem - CollidedItems[0]); + SmashObject(currentItemNumber); + KillItem(currentItemNumber); } - else if (Objects[currentItem->objectNumber].hitEffect) + // TODO_LUA: we need to handle it with an event like OnDestroy + /*else if (currentObj->hitEffect == HIT_SPECIAL) { - GAME_VECTOR pos(item->pos.xPos, item->pos.yPos, item->pos.zPos); - HitTarget(currentItem, &pos, Weapons[WEAPON_CROSSBOW].damage, 0); + // Some objects need a custom behaviour + //HitSpecial(item, currentItem, 1); + }*/ - // Poisoned ammos - if (item->itemFlags[0] == CROSSBOW_POISON && !Objects[currentItem->objectNumber].explodableMeshbits) - item->poisoned = true; - } + // All other items (like puzzles) don't explode k++; currentItem = CollidedItems[k]; @@ -1153,18 +1496,20 @@ void ControlCrossbowBolt(short itemNumber) do { - if (currentMesh->staticNumber >= 50 && currentMesh->staticNumber < 58) // SHATTER + STATIC_INFO* s = &StaticObjects[currentMesh->staticNumber]; + if (s->shatterType != SHT_NONE) { - if (explode) + currentMesh->hitPoints -= Weapons[WEAPON_CROSSBOW].damage; + if (currentMesh->hitPoints <= 0) { TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber); TriggerShockwave(&PHD_3DPOS(currentMesh->x, currentMesh->y - 128, currentMesh->z, 0, currentMesh->yRot, 0), 40, 176, 64, 0, 96, 128, 16, 0, 0); + ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0); // TODO: this wont work !! + SmashedMeshRoom[SmashedMeshCount] = item->roomNumber; + SmashedMesh[SmashedMeshCount] = currentMesh; + SmashedMeshCount++; + currentMesh->flags &= ~1; } - ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0); // TODO: this wont work !! - SmashedMeshRoom[SmashedMeshCount] = item->roomNumber; - SmashedMesh[SmashedMeshCount] = currentMesh; - SmashedMeshCount++; - currentMesh->flags &= ~1; } k++; @@ -1183,40 +1528,37 @@ void ControlCrossbowBolt(short itemNumber) if (!explode) { + // If bolt has hit some objects then shatter itself if (foundCollidedObjects) { ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL); KillItem(itemNumber); } - return; - } - - // At this point, for sure bolt must explode - if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) - { - TriggerUnderwaterExplosion(item, 0); } else { - TriggerShockwave(&item->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0); - item->pos.yPos += 128; - TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, item->roomNumber); - for (int j = 0; j < 2; j++) - TriggerExplosionSparks(oldX, oldY, oldZ, 3, -1, 0, item->roomNumber); - } + // Explode + if (g_Level.Rooms[item->roomNumber].flags & ENV_FLAG_WATER) + { + TriggerUnderwaterExplosion(item, 0); + } + else + { + TriggerShockwave(&item->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0); + item->pos.yPos += 128; + TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, item->roomNumber); + for (int j = 0; j < 2; j++) + TriggerExplosionSparks(oldX, oldY, oldZ, 3, -1, 0, item->roomNumber); + } - AlertNearbyGuards(item); - - SoundEffect(SFX_EXPLOSION1, &item->pos, PITCH_SHIFT | 0x1800000); - SoundEffect(SFX_EXPLOSION2, &item->pos, 0); + AlertNearbyGuards(item); + + SoundEffect(SFX_EXPLOSION1, &item->pos, PITCH_SHIFT | 0x1800000); + SoundEffect(SFX_EXPLOSION2, &item->pos, 0); - if (foundCollidedObjects || explode) - { ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL); KillItem(itemNumber); } - - return; } void RifleHandler(int weaponType) @@ -1274,88 +1616,152 @@ void RifleHandler(int weaponType) void FireCrossbow(PHD_3DPOS* pos) { short* ammos = GetAmmo(WEAPON_CROSSBOW); - if (*ammos <= 0) - return; - - Lara.hasFired = true; - - short itemNumber = CreateItem(); - if (itemNumber != NO_ITEM) + if (*ammos != 0) { - ITEM_INFO* item = &g_Level.Items[itemNumber]; - item->objectNumber = ID_CROSSBOW_BOLT; - item->shade = 0xC210; - if (pos) + Lara.hasFired = true; + + short itemNumber = CreateItem(); + if (itemNumber != NO_ITEM) { - item->roomNumber = LaraItem->roomNumber; - item->pos.xPos = pos->xPos; - item->pos.yPos = pos->yPos; - item->pos.zPos = pos->zPos; + ITEM_INFO* item = &g_Level.Items[itemNumber]; + item->objectNumber = ID_CROSSBOW_BOLT; + item->shade = 0xC210; + if (pos) + { + item->roomNumber = LaraItem->roomNumber; + item->pos.xPos = pos->xPos; + item->pos.yPos = pos->yPos; + item->pos.zPos = pos->zPos; - InitialiseItem(itemNumber); + InitialiseItem(itemNumber); - item->pos.xRot = pos->xRot; - item->pos.yRot = pos->yRot; - item->pos.zRot = pos->zRot; + item->pos.xRot = pos->xRot; + item->pos.yRot = pos->yRot; + item->pos.zRot = pos->zRot; + } + else + { + if (*ammos != -1) + (*ammos)--; + + PHD_VECTOR jointPos; + jointPos.x = 0; + jointPos.y = 228; + jointPos.z = 32; + + GetLaraJointPosition(&jointPos, LM_RHAND); + + item->roomNumber = LaraItem->roomNumber; + + FLOOR_INFO * floor = GetFloor(jointPos.x, jointPos.y, jointPos.z, &item->roomNumber); + int height = GetFloorHeight(floor, jointPos.x, jointPos.y, jointPos.z); + + if (height >= jointPos.y) + { + item->pos.xPos = jointPos.x; + item->pos.yPos = jointPos.y; + item->pos.zPos = jointPos.z; + } + else + { + item->pos.xPos = LaraItem->pos.xPos; + item->pos.yPos = jointPos.y; + item->pos.zPos = LaraItem->pos.zPos; + item->roomNumber = LaraItem->roomNumber; + } + + InitialiseItem(itemNumber); + + item->pos.xRot = Lara.leftArm.xRot + LaraItem->pos.xRot; + item->pos.zRot = 0; + item->pos.yRot = Lara.leftArm.yRot + LaraItem->pos.yRot; + + if (!Lara.leftArm.lock) + { + item->pos.xRot += Lara.torsoXrot; + item->pos.yRot += Lara.torsoYrot; + } + } + + item->speed = 512; + + AddActiveItem(itemNumber); + + item->itemFlags[0] = Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo; + + SoundEffect(SFX_TR4_LARA_CROSSBOW, 0, 0); + + Savegame.Level.AmmoUsed++; + Savegame.Game.AmmoUsed++; } - else + } +} + +void FireRocket() +{ + short* ammos = GetAmmo(WEAPON_ROCKET_LAUNCHER); + if (*ammos != 0) + { + Lara.hasFired = true; + + short itemNumber = CreateItem(); + if (itemNumber != NO_ITEM) { + ITEM_INFO* item = &g_Level.Items[itemNumber]; + item->objectNumber = ID_ROCKET; + item->roomNumber = LaraItem->roomNumber; + if (*ammos != -1) (*ammos)--; PHD_VECTOR jointPos; jointPos.x = 0; - jointPos.y = 228; - jointPos.z = 32; + jointPos.y = 180; + jointPos.z = 72; GetLaraJointPosition(&jointPos, LM_RHAND); - item->roomNumber = LaraItem->roomNumber; - - FLOOR_INFO* floor = GetFloor(jointPos.x, jointPos.y, jointPos.z, &item->roomNumber); - int height = GetFloorHeight(floor, jointPos.x, jointPos.y, jointPos.z); + int x, y, z; + item->pos.xPos = x = jointPos.x; + item->pos.yPos = y = jointPos.y; + item->pos.zPos = z = jointPos.z; - if (height >= jointPos.y) - { - item->pos.xPos = jointPos.x; - item->pos.yPos = jointPos.y; - item->pos.zPos = jointPos.z; - } - else - { - item->pos.xPos = LaraItem->pos.xPos; - item->pos.yPos = jointPos.y; - item->pos.zPos = LaraItem->pos.zPos; - item->roomNumber = LaraItem->roomNumber; - } + jointPos.x = 0; + jointPos.y = 180 + 1024; + jointPos.z = 72; + + SmokeCountL = 32; + SmokeWeapon = WEAPON_ROCKET_LAUNCHER; + + for (int i = 0; i < 5; i++) + TriggerGunSmoke(x, y, z, jointPos.x - x, jointPos.y - y, jointPos.z - z, 1, WEAPON_ROCKET_LAUNCHER, 32); InitialiseItem(itemNumber); - item->pos.xRot = Lara.leftArm.xRot + LaraItem->pos.xRot; + item->pos.xRot = LaraItem->pos.xRot + Lara.leftArm.xRot; + item->pos.yRot = LaraItem->pos.yRot + Lara.leftArm.yRot; item->pos.zRot = 0; - item->pos.yRot = Lara.leftArm.yRot + LaraItem->pos.yRot; if (!Lara.leftArm.lock) { item->pos.xRot += Lara.torsoXrot; item->pos.yRot += Lara.torsoYrot; } + + item->speed = 512 >> 5; + item->itemFlags[0] = 0; + + AddActiveItem(itemNumber); + + SoundEffect(SFX_EXPLOSION1, 0, 0); + + Savegame.Level.AmmoUsed++; + Savegame.Game.AmmoUsed++; } - - item->speed = 512; - - AddActiveItem(itemNumber); - - item->itemFlags[0] = Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo; - - SoundEffect(SFX_TR4_LARA_CROSSBOW, 0, 0); - - Savegame.Level.AmmoUsed++; - Savegame.Game.AmmoUsed++; } } -void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src) +void DoExplosiveDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src, int weapon) { if (!(dest->flags & 0x8000)) { @@ -1368,7 +1774,7 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src) OBJECT_INFO* obj = &Objects[dest->objectNumber]; if (!obj->undead) { - HitTarget(dest, 0, 30, 1); + HitTarget(dest, 0, Weapons[weapon].damage, 1); if (dest != LaraItem) { Savegame.Game.AmmoHits++; @@ -1383,8 +1789,8 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src) } else { - LaraItem->hitPoints -= 50; - if (!(g_Level.Rooms[dest->roomNumber].flags & ENV_FLAG_WATER) && LaraItem->hitPoints <= 50) + LaraItem->hitPoints -= Weapons[weapon].damage; + if (!(g_Level.Rooms[dest->roomNumber].flags & ENV_FLAG_WATER) && LaraItem->hitPoints <= Weapons[weapon].damage) LaraBurn(); } } @@ -1497,110 +1903,18 @@ void undraw_shotgun(int weapon) void undraw_shotgun_meshes(int weapon) { Lara.holsterInfo.backHolster = HolsterSlotForWeapon(static_cast(weapon)); - //LARA_MESHES(ID_LARA, LM_RHAND); Lara.meshPtrs[LM_RHAND] = Objects[ID_LARA_SKIN].meshIndex + LM_RHAND; } void draw_shotgun_meshes(int weaponType) { Lara.holsterInfo.backHolster = HOLSTER_SLOT::Empty; - //LARA_MESHES(WeaponObjectMesh(weaponType), LM_RHAND); Lara.meshPtrs[LM_RHAND] = Objects[WeaponObjectMesh(weaponType)].meshIndex + LM_RHAND; } -void DoCrossbowDamage(ITEM_INFO* item1, ITEM_INFO* item2, signed int search) +void HitSpecial(ITEM_INFO* projectile, ITEM_INFO* target, int flags) { - /*v4 = item2; - if (!(item2->flags & 0x40)) - { - if (search) - { - int numSpheres = GetSpheres(item2, CreatureSpheres, 1, Matrix::Identity); - int best = -1; - int bestDistance = 0x7FFFFFFF; - - for (int i = 0; i < numSpheres; i++) - { - SPHERE* sphere = &CreatureSpheres[i]; - - int dx = sphere->x - item1->pos.xPos; - int dy = sphere->y - item1->pos.yPos; - int dz = sphere->z - item1->pos.zPos; - - if (SQUARE(dx) + SQUARE(dy) + SQUARE(dz) - SQUARE(sphere->r) < bestDistance) - { - bestDistance = SQUARE(dx) + SQUARE(dy) + SQUARE(dz) - SQUARE(sphere->r); - best = i; - } - } - - if (numSpheres > 0) - { - v7 = &Slist[0].z; - v8 = item1->pos.yPos; - v9 = item1->pos.zPos; - item1a = item1->pos.xPos; - v20 = v8; - v21 = v9; - do - { - r = v7[1]; - a1 = *(v7 - 2) - item1a; - v11 = *(v7 - 1) - v20; - if (dx2 + dy2 + dz2 - r2 < search) - { - search = (dx2 + dy2 + dz2 - r2; - best = item2; - } - v5 = v22; - v7 += 4; - item2 = (item2 + 1); - } while (item2 < v22); - best = best; - } - } - else - { - v5 = Objects[item2->objectNumber].nmeshes; - v6 = v5 - 1; - } - if (v6 == v5 - 1) - { - if (v4->flags & 0x3E00 && (item2->flags & 0x3E00) != 15872) - { - short roomNumber = item2->roomNumber; - FLOOR_INFO* floor = GetFloor(item2->pos.xPos, item2->pos.yPos - 256, item2->pos.zPos, &roomNumber); - GetFloorHeight(floor, item2->pos.xPos, item2->pos.yPos - 256, item2->pos.zPos); - TestTriggers(TriggerIndex, 1, item2->flags & 0x3E00); - } - else - { - v14 = GetSwitchTrigger(v4, &ItemNos, 1); - if (v14 > 0) - { - v15 = v14; - v16 = (&v22 + 2 * v14 + 2); - do - { - AddActiveItem(*v16); - v17 = *v16; - --v16; - Items[v17]._bf15ea = g_Level.Items[v17]._bf15ea & 0xFFFFFFFB | 2; - HIBYTE(g_Level.Items[v16[1]].flags) |= 0x3Eu; - --v15; - } while (v15); - } - } - - if (item2->objectNumber == ID_SHOOT_SWITCH1) - ExplodeItemNode(item2, Objects[ID_SHOOT_SWITCH1].nmeshes - 1, 0, 64); - - AddActiveItem((item2 - Items)); - item2->flags |= 0x3E40; - item2->status = ITEM_ACTIVE; - } - }*/ - // what is this 2.0 + } void FireHK(int mode) diff --git a/TR5Main/Game/lara1gun.h b/TR5Main/Game/lara1gun.h index fcac24532..0bcc7519b 100644 --- a/TR5Main/Game/lara1gun.h +++ b/TR5Main/Game/lara1gun.h @@ -19,6 +19,9 @@ constexpr auto CROSSBOW_AMMO3 = 2; constexpr auto CROSSBOW_HIT_RADIUS = 128; constexpr auto CROSSBOW_EXPLODE_RADIUS = SECTOR(2); constexpr auto GRENADE_EXPLODE_RADIUS = SECTOR(2); +constexpr auto ROCKET_EXPLODE_RADIUS = 2048; +constexpr auto ROCKET_DAMAGE = 100; +constexpr auto HARPOON_HIT_RADIUS = 128; void FireGrenade(); void ControlGrenade(short itemNumber); @@ -30,13 +33,15 @@ void AnimateShotgun(int weaponType); void ControlCrossbowBolt(short itemNumber); void FireCrossbow(PHD_3DPOS* pos); void RifleHandler(int weaponType); -void DoGrenadeDamageOnBaddie(ITEM_INFO* src, ITEM_INFO* dest); +void DoExplosiveDamageOnBaddie(ITEM_INFO* src, ITEM_INFO* dest, int weapon); void TriggerUnderwaterExplosion(ITEM_INFO* item, int flag); void undraw_shotgun_meshes(int weapon); void undraw_shotgun(int weapon); void draw_shotgun_meshes(int weaponType); void FireHK(int mode); void FireShotgun(); -void DoCrossbowDamage(ITEM_INFO* item1, ITEM_INFO* item2, signed int search); +void HitSpecial(ITEM_INFO* projectile, ITEM_INFO* target, int flags); void ready_shotgun(int weaponType); -void SomeSparkEffect(int x, int y, int z, int count); \ No newline at end of file +void SomeSparkEffect(int x, int y, int z, int count); +void FireRocket(); +void ControlRocket(short itemNumber); \ No newline at end of file diff --git a/TR5Main/Game/larafire.cpp b/TR5Main/Game/larafire.cpp index 431bab75d..a191d0df1 100644 --- a/TR5Main/Game/larafire.cpp +++ b/TR5Main/Game/larafire.cpp @@ -372,23 +372,17 @@ void LaraGun() // (F) (D) || LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT) && (Lara.requestGunType == WEAPON_HK || Lara.requestGunType == WEAPON_CROSSBOW -#if 1 - || Lara.requestGunType == WEAPON_SHOTGUN)) -#else || Lara.requestGunType == WEAPON_SHOTGUN || Lara.requestGunType == WEAPON_HARPOON_GUN)) -#endif { if (Lara.gunType == WEAPON_FLARE) Lara.requestGunType = WEAPON_FLARE; } else if (Lara.requestGunType == WEAPON_FLARE -#if 0 || Lara.Vehicle == NO_ITEM && (Lara.requestGunType == WEAPON_HARPOON_GUN -#endif || Lara.waterStatus == LW_ABOVE_WATER - || Lara.waterStatus == LW_WADE + || Lara.waterStatus == LW_WADE) && Lara.waterSurfaceDist > -Weapons[Lara.gunType].gunHeight) { if (Lara.gunType == WEAPON_FLARE) @@ -417,14 +411,19 @@ void LaraGun() // (F) (D) } else if (Lara.gunStatus == LG_READY) { -#if 0 - if ((TrInput & IN_DRAW) || Lara.requestGunType != Lara.gunType || Lara.gunType != WEAPON_HARPOON_GUN && Lara.waterStatus != LW_ABOVE_WATER && Lara.waterStatus != LW_WADE || Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight) -#else - if ((TrInput & IN_DRAW) || Lara.requestGunType != Lara.gunType || Lara.waterStatus != LW_ABOVE_WATER && Lara.waterStatus != LW_WADE || Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight) -#endif + if ((TrInput & IN_DRAW) + || Lara.requestGunType != Lara.gunType) + Lara.gunStatus = LG_UNDRAW_GUNS; + else if (Lara.gunType != WEAPON_HARPOON_GUN + && Lara.waterStatus != LW_ABOVE_WATER + && (Lara.waterStatus != LW_WADE + || Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight)) Lara.gunStatus = LG_UNDRAW_GUNS; } - else if (Lara.gunStatus == LG_HANDS_BUSY && (TrInput & IN_FLARE) && LaraItem->currentAnimState == LS_CRAWL_IDLE && LaraItem->animNumber == LA_CRAWL_IDLE) + else if (Lara.gunStatus == LG_HANDS_BUSY + && (TrInput & IN_FLARE) + && LaraItem->currentAnimState == LS_CRAWL_IDLE + && LaraItem->animNumber == LA_CRAWL_IDLE) { Lara.requestGunType = WEAPON_FLARE; } @@ -471,7 +470,6 @@ void LaraGun() // (F) (D) break; case LG_UNDRAW_GUNS: - //LARA_MESHES(ID_LARA, LM_HEAD); Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD; switch (Lara.gunType) @@ -502,10 +500,8 @@ void LaraGun() // (F) (D) case LG_READY: if (!(TrInput & IN_ACTION)) - //LARA_MESHES(ID_LARA, LM_HEAD); Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD; else - //LARA_MESHES(ID_LARA_SCREAM, LM_HEAD); Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SCREAM].meshIndex + LM_HEAD; if (Camera.type != CINEMATIC_CAMERA && Camera.type != LOOK_CAMERA && Camera.type != HEAVY_CAMERA) diff --git a/TR5Main/Game/laramisc.cpp b/TR5Main/Game/laramisc.cpp index 83a61b2c5..28e5affae 100644 --- a/TR5Main/Game/laramisc.cpp +++ b/TR5Main/Game/laramisc.cpp @@ -177,13 +177,13 @@ void LaraCheatGetStuff() // (F) (D) if (Objects[ID_CROSSBOW_ITEM].loaded) { - Lara.Weapons[ID_CROSSBOW_ITEM].Present = true; - Lara.Weapons[ID_CROSSBOW_ITEM].SelectedAmmo = WEAPON_AMMO1; - Lara.Weapons[ID_CROSSBOW_ITEM].HasLasersight = false; - Lara.Weapons[ID_CROSSBOW_ITEM].HasSilencer = false; - Lara.Weapons[ID_CROSSBOW_ITEM].Ammo[WEAPON_AMMO1] = -1; - Lara.Weapons[ID_CROSSBOW_ITEM].Ammo[WEAPON_AMMO2] = -1; - Lara.Weapons[ID_CROSSBOW_ITEM].Ammo[WEAPON_AMMO3] = -1; + Lara.Weapons[WEAPON_CROSSBOW].Present = true; + Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = WEAPON_AMMO1; + Lara.Weapons[WEAPON_CROSSBOW].HasLasersight = false; + Lara.Weapons[WEAPON_CROSSBOW].HasSilencer = false; + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] = -1; + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] = -1; + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] = -1; } g_Inventory.LoadObjects(false); diff --git a/TR5Main/Game/room.h b/TR5Main/Game/room.h index 7c3026e72..1cc882977 100644 --- a/TR5Main/Game/room.h +++ b/TR5Main/Game/room.h @@ -44,6 +44,7 @@ typedef struct MESH_INFO short shade; short flags; short staticNumber; + int hitPoints; }; typedef struct LIGHTINFO diff --git a/TR5Main/Objects/TR5/tr5_objects.cpp b/TR5Main/Objects/TR5/tr5_objects.cpp index 207fb7baa..a2846a40f 100644 --- a/TR5Main/Objects/TR5/tr5_objects.cpp +++ b/TR5Main/Objects/TR5/tr5_objects.cpp @@ -1177,6 +1177,7 @@ static void StartProjectiles(OBJECT_INFO *obj) InitProjectile(obj, MissileControl, ID_IMP_ROCK, true); InitProjectile(obj, TorpedoControl, ID_TORPEDO); InitProjectile(obj, ControlGrenade, ID_GRENADE); + InitProjectile(obj, ControlRocket, ID_ROCKET); InitProjectile(obj, ControlHarpoonBolt, ID_HARPOON); InitProjectile(obj, ControlCrossbowBolt, ID_CROSSBOW_BOLT); } diff --git a/TR5Main/Renderer/Render11Helper.cpp b/TR5Main/Renderer/Render11Helper.cpp index 3a69c0151..68bd1c771 100644 --- a/TR5Main/Renderer/Render11Helper.cpp +++ b/TR5Main/Renderer/Render11Helper.cpp @@ -410,9 +410,9 @@ namespace T5M::Renderer if (meshPtr->positions.size() == 0) return mesh; - mesh->Positions.reserve(meshPtr->positions.size()); + mesh->Positions.resize(meshPtr->positions.size()); for (int i = 0; i < meshPtr->positions.size(); i++) - mesh->Positions.push_back(meshPtr->positions[i]); + mesh->Positions[i] = meshPtr->positions[i]; for (int n = 0; n < meshPtr->buckets.size(); n++) { @@ -427,14 +427,17 @@ namespace T5M::Renderer bucket = &mesh->Buckets[bucketIndex]; - bucket->Vertices.reserve(levelBucket->numQuads * 4 + levelBucket->numTriangles * 3); - bucket->Indices.reserve(levelBucket->numQuads * 6 + levelBucket->numTriangles * 3); + bucket->Vertices.resize(levelBucket->numQuads * 4 + levelBucket->numTriangles * 3); + bucket->Indices.resize(levelBucket->numQuads * 6 + levelBucket->numTriangles * 3); + + int lastVertex = 0; + int lastIndex = 0; for (int p = 0; p < levelBucket->polygons.size(); p++) { POLYGON* poly = &levelBucket->polygons[p]; - int baseVertices = bucket->Vertices.size(); + int baseVertices = lastVertex; // bucket->Vertices.size(); for (int k = 0; k < poly->indices.size(); k++) { @@ -463,23 +466,34 @@ namespace T5M::Renderer /*if (isHairs) vertex.Bone = v;*/ - bucket->Vertices.push_back(vertex); + bucket->Vertices[lastVertex++] = vertex; } if (poly->shape == 0) { - bucket->Indices.push_back(baseVertices); + bucket->Indices[lastIndex++] = baseVertices; + bucket->Indices[lastIndex++] = baseVertices + 1; + bucket->Indices[lastIndex++] = baseVertices + 3; + bucket->Indices[lastIndex++] = baseVertices + 2; + bucket->Indices[lastIndex++] = baseVertices + 3; + bucket->Indices[lastIndex++] = baseVertices + 1; + + /*bucket->Indices.push_back(baseVertices); bucket->Indices.push_back(baseVertices + 1); bucket->Indices.push_back(baseVertices + 3); bucket->Indices.push_back(baseVertices + 2); bucket->Indices.push_back(baseVertices + 3); - bucket->Indices.push_back(baseVertices + 1); + bucket->Indices.push_back(baseVertices + 1);*/ } else { - bucket->Indices.push_back(baseVertices); + bucket->Indices[lastIndex++] = baseVertices; + bucket->Indices[lastIndex++] = baseVertices + 1; + bucket->Indices[lastIndex++] = baseVertices + 2; + + /*bucket->Indices.push_back(baseVertices); bucket->Indices.push_back(baseVertices + 1); - bucket->Indices.push_back(baseVertices + 2); + bucket->Indices.push_back(baseVertices + 2);*/ } } } diff --git a/TR5Main/Renderer/Renderer11DrawEffect.cpp b/TR5Main/Renderer/Renderer11DrawEffect.cpp index 2c860f45b..813660061 100644 --- a/TR5Main/Renderer/Renderer11DrawEffect.cpp +++ b/TR5Main/Renderer/Renderer11DrawEffect.cpp @@ -453,9 +453,9 @@ namespace T5M::Renderer { pos + p3, pos + p4, Vector4( - shockwave->r * shockwave->life / 255.0f / 64.0f, - shockwave->g * shockwave->life / 255.0f / 64.0f, - shockwave->b * shockwave->life / 255.0f / 64.0f, + shockwave->r * shockwave->life / 255.0f / 16.0f, + shockwave->g * shockwave->life / 255.0f / 16.0f, + shockwave->b * shockwave->life / 255.0f / 16.0f, 1.0f), 0, 1, 0, 0, BLENDMODE_ALPHABLEND); diff --git a/TR5Main/Specific/setup.h b/TR5Main/Specific/setup.h index ac3ff01dc..98f115fd4 100644 --- a/TR5Main/Specific/setup.h +++ b/TR5Main/Specific/setup.h @@ -9,6 +9,7 @@ enum HitEffectEnum HIT_BLOOD, HIT_SMOKE, HIT_FRAGMENT, + HIT_SPECIAL, MAX_HIT_EFFECT }; @@ -59,11 +60,19 @@ struct STATIC_INFO int flags; BOUNDING_BOX visibilityBox; BOUNDING_BOX collisionBox; + int shatterType; + int shatterDamage; + int shatterSound; }; #define MAX_STATICS 1000 +constexpr auto SF_NO_COLLISION = 0x01; +constexpr auto SF_SHATTERABLE = 0x02; constexpr auto GRAVITY = 6; constexpr auto SWAMP_GRAVITY = 2; +constexpr auto SHT_NONE = 0; +constexpr auto SHT_EXPLODE = 1; +constexpr auto SHT_FRAGMENT = 2; extern OBJECT_INFO Objects[ID_NUMBER_OBJECTS]; extern STATIC_INFO StaticObjects[MAX_STATICS]; From 0420de3419ed7e7b2af9ce2c3b2596ec1c0ca96d Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Sun, 16 Aug 2020 16:01:24 +0200 Subject: [PATCH 17/22] Adjusted GunSmoke --- TR5Main/Game/smoke.cpp | 31 ++++++++++++++++--------------- TR5Main/Game/smoke.h | 1 - TR5Main/Game/trmath.cpp | 20 +++++++++++++++++++- TR5Main/Game/trmath.h | 2 ++ 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/TR5Main/Game/smoke.cpp b/TR5Main/Game/smoke.cpp index d4e060949..9e7913db1 100644 --- a/TR5Main/Game/smoke.cpp +++ b/TR5Main/Game/smoke.cpp @@ -10,7 +10,14 @@ namespace T5M { namespace Effects { namespace Smoke { std::array SmokeParticles; - + SmokeParticle& getFreeSmokeParticle() + { + for(int i = 0; i < SmokeParticles.size(); i++){ + if(!SmokeParticles[i].active) + return SmokeParticles[i]; + } + return SmokeParticles[0]; + } void UpdateSmokeParticles() { for (int i = 0; i < SmokeParticles.size(); i++) { @@ -70,23 +77,15 @@ namespace T5M { s.room = room; } - SmokeParticle& getFreeSmokeParticle() - { - for (int i = 0; i < SmokeParticles.size(); i++) { - if (!SmokeParticles[i].active) - return SmokeParticles[i]; - } - return SmokeParticles[0]; - } - void TriggerGunSmokeParticles(int x, int y, int z, short xv, short yv, short zv, byte initial, int weaponType, byte count) { SmokeParticle& s = getFreeSmokeParticle(); s = {}; s.active = true; s.position = Vector3(x, y, z); - Vector3(xv, yv, zv).Normalize(s.velocity); - s.velocity *= frand() * 24 + 16; + Vector3 dir = Vector3(xv, yv, zv); + dir.Normalize(); + s.velocity = dir; s.gravity = -.1f; s.affectedByWind = g_Level.Rooms[LaraItem->roomNumber].flags & ENV_FLAG_WIND; s.sourceColor = Vector4(.4, .4, .4, 1); @@ -98,9 +97,10 @@ namespace T5M { s.sourceSize = size *2; s.destinationSize = size * 8; s.terminalVelocity = 0; - s.friction = 0.90f; + s.friction = 0.88f; s.life = frand() * 30 + 60; - + s.velocity = getRandomVectorInCone(s.velocity, 10); + s.velocity *= frand() * 14 + 16; } else { @@ -111,13 +111,14 @@ namespace T5M { s.terminalVelocity = 0; s.friction = 0.97f; s.life = frand() * 20 + 42; + s.velocity *= frand() * 24 + 16; } s.position = Vector3(x, y, z); s.position += Vector3(frandMinMax(-8, 8), frandMinMax(-8, 8), frandMinMax(-8, 8)); s.angularVelocity = frandMinMax(-PI / 4, PI / 4); - s.angularDrag = 0.8f; + s.angularDrag = 0.95f; s.room = LaraItem->roomNumber; } diff --git a/TR5Main/Game/smoke.h b/TR5Main/Game/smoke.h index 879712e59..30cca65ce 100644 --- a/TR5Main/Game/smoke.h +++ b/TR5Main/Game/smoke.h @@ -32,7 +32,6 @@ namespace T5M{ void UpdateSmokeParticles(); void TriggerFlareSmoke(const DirectX::SimpleMath::Vector3& pos, DirectX::SimpleMath::Vector3& direction, int age, int room); - SmokeParticle& getFreeSmokeParticle(); void TriggerGunSmokeParticles(int x, int y, int z, short xv, short yv, short zv, byte initial, int weaponType, byte count); } diff --git a/TR5Main/Game/trmath.cpp b/TR5Main/Game/trmath.cpp index d13766ffb..2f9c1aea7 100644 --- a/TR5Main/Game/trmath.cpp +++ b/TR5Main/Game/trmath.cpp @@ -1325,7 +1325,7 @@ float TO_RAD(short angle) const float frand() { - float result = float((float)rand() / RAND_MAX); + float result = float(static_cast(rand()) / RAND_MAX); return result; } @@ -1339,6 +1339,24 @@ const float lerp(float v0, float v1, float t) return (1 - t) * v0 + t * v1; } +const Vector3 getRandomVector() +{ + Vector3 v = {frandMinMax(-1,1),frandMinMax(-1,1),frandMinMax(-1,1)}; + v.Normalize(); + return v; +} + +const Vector3 getRandomVectorInCone(const Vector3& direction, const float angleDegrees) +{ + float x = frandMinMax(-angleDegrees, angleDegrees) * RADIAN; + float y = frandMinMax(-angleDegrees, angleDegrees) * RADIAN; + float z = frandMinMax(-angleDegrees, angleDegrees) * RADIAN; + Matrix m = Matrix::CreateRotationX(x)* Matrix::CreateRotationY(y) * Matrix::CreateRotationZ(z); + Vector3 result = direction.TransformNormal(direction, m); + result.Normalize(); + return result; +} + // FIXME: game code still expects << 2 >> W2V_SHIFT so we multiply by 16384.0f int phd_sin(short a) { diff --git a/TR5Main/Game/trmath.h b/TR5Main/Game/trmath.h index 69436b035..0bd2da3bd 100644 --- a/TR5Main/Game/trmath.h +++ b/TR5Main/Game/trmath.h @@ -45,6 +45,8 @@ int phd_cos(short a); const float frand(); const float frandMinMax(float min, float max); const float lerp(float v0, float v1, float t); +const Vector3 getRandomVector(); +const Vector3 getRandomVectorInCone(const Vector3& direction,const float angleDegrees); int mGetAngle(int x1, int y1, int x2, int y2); int phd_atan(int dz, int dx); void phd_GetVectorAngles(int x, int y, int z, short* angles); From 73789e38bd193a1788be4a14d096f9b4eafeebf3 Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Sun, 16 Aug 2020 21:06:35 +0200 Subject: [PATCH 18/22] Restored Lara's damage with grenade; HP for statics; --- TR5Main/Game/lara1gun.cpp | 6 +++--- TR5Main/Game/room.h | 2 +- TR5Main/Specific/level.cpp | 5 +++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/TR5Main/Game/lara1gun.cpp b/TR5Main/Game/lara1gun.cpp index 7ec9c460e..bcc2d27a2 100644 --- a/TR5Main/Game/lara1gun.cpp +++ b/TR5Main/Game/lara1gun.cpp @@ -736,7 +736,7 @@ void ControlGrenade(short itemNumber) // Step 1: done only if explosion, try to smash all objects in the blast radius // Found possible collided items and statics - GetCollidedObjects(item, radius, 1, &CollidedItems[0], &CollidedMeshes[0], 1); + GetCollidedObjects(item, radius, 1, &CollidedItems[0], &CollidedMeshes[0], false); // If no collided items and meshes are found, then exit the loop if (!CollidedItems[0] && !CollidedMeshes[0]) @@ -972,7 +972,7 @@ void ControlRocket(short itemNumber) // Step 1: done only if explosion, try to smash all objects in the blast radius // Found possible collided items and statics - GetCollidedObjects(item, radius, 1, &CollidedItems[0], &CollidedMeshes[0], 1); + GetCollidedObjects(item, radius, 1, &CollidedItems[0], &CollidedMeshes[0], true); // If no collided items and meshes are found, then exit the loop if (!CollidedItems[0] && !CollidedMeshes[0]) @@ -1456,7 +1456,7 @@ void ControlCrossbowBolt(short itemNumber) // Step 1: done only if explosion, try to smash all objects in the blast radius // Found possible collided items and statics - GetCollidedObjects(item, radius, 1, &CollidedItems[0], &CollidedMeshes[0], 1); + GetCollidedObjects(item, radius, 1, &CollidedItems[0], &CollidedMeshes[0], true); // If no collided items and meshes are found, then exit the loop if (!CollidedItems[0] && !CollidedMeshes[0]) diff --git a/TR5Main/Game/room.h b/TR5Main/Game/room.h index 1cc882977..de4a9f553 100644 --- a/TR5Main/Game/room.h +++ b/TR5Main/Game/room.h @@ -44,7 +44,7 @@ typedef struct MESH_INFO short shade; short flags; short staticNumber; - int hitPoints; + short hitPoints; }; typedef struct LIGHTINFO diff --git a/TR5Main/Specific/level.cpp b/TR5Main/Specific/level.cpp index 5cb693e2c..ee09aacd7 100644 --- a/TR5Main/Specific/level.cpp +++ b/TR5Main/Specific/level.cpp @@ -342,6 +342,10 @@ void LoadObjects() StaticObjects[meshID].collisionBox.Z2 = ReadInt16(); StaticObjects[meshID].flags = (short)ReadInt16(); + + StaticObjects[meshID].shatterType = (short)ReadInt16(); + StaticObjects[meshID].shatterDamage = (short)ReadInt16(); + StaticObjects[meshID].shatterSound = (short)ReadInt16(); } // HACK: to remove after decompiling LoadSprites @@ -631,6 +635,7 @@ void ReadRooms() mesh.shade = ReadUInt16(); mesh.flags = ReadUInt16(); mesh.staticNumber = ReadUInt16(); + mesh.hitPoints = ReadInt16(); room.mesh.push_back(mesh); } From 0ea6152462306f27b1560e44a78e90e2db4b8c98 Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Mon, 17 Aug 2020 15:02:56 +0200 Subject: [PATCH 19/22] Fixed hit target action for grenade/harpoon/crossbow/rocket --- TR5Main/Game/lara1gun.cpp | 85 +++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/TR5Main/Game/lara1gun.cpp b/TR5Main/Game/lara1gun.cpp index bcc366a02..5b9959c65 100644 --- a/TR5Main/Game/lara1gun.cpp +++ b/TR5Main/Game/lara1gun.cpp @@ -228,40 +228,18 @@ void ControlHarpoonBolt(short itemNumber) if (CollidedItems[0]) { ITEM_INFO* currentItem = CollidedItems[0]; - OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; - + int k = 0; do { - if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) - || currentItem->objectNumber == ID_LARA - || (currentItem->flags & 0x40 && - (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem))) - { - // All active intelligent creatures explode, if their HP is <= 0 - // Explosion is handled by CreatureDie() - // Also Lara can be damaged - // HitTarget() is called inside this - DoExplosiveDamageOnBaddie(currentItem, item, WEAPON_CROSSBOW); - } - else if (currentItem->objectNumber >= ID_SMASH_OBJECT1 && currentItem->objectNumber <= ID_SMASH_OBJECT8) - { - // Smash objects are legacy objects from TRC, let's make them explode in the legacy way - TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); - TriggerShockwave(&PHD_3DPOS(currentItem->pos.xPos, currentItem->pos.yPos - 128, currentItem->pos.zPos), 48, 304, 96, 0, 96, 128, 24, 0, 0); - ExplodeItemNode(currentItem, 0, 0, 128); - short currentItemNumber = (currentItem - CollidedItems[0]); - SmashObject(currentItemNumber); - KillItem(currentItemNumber); - } - // TODO_LUA: we need to handle it with an event like OnDestroy - /*else if (currentObj->hitEffect == HIT_SPECIAL) - { - // Some objects need a custom behaviour - //HitSpecial(item, currentItem, 1); - }*/ + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; - // All other items (like puzzles) don't explode + if (currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE && !currentObj->undead) + { + HitTarget(currentItem, (GAME_VECTOR*)&item->pos, Weapons[WEAPON_HARPOON_GUN].damage, 0); + } + + // All other items (like puzzles) can't be hit k++; currentItem = CollidedItems[k]; @@ -635,12 +613,13 @@ void ControlGrenade(short itemNumber) if (explode) { ITEM_INFO* currentItem = CollidedItems[0]; - OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; - + int k = 0; do { - if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + + if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE && !currentObj->undead) || currentItem->objectNumber == ID_LARA || (currentItem->flags & 0x40 && (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem))) @@ -865,11 +844,12 @@ void ControlRocket(short itemNumber) if (CollidedItems[0]) { ITEM_INFO* currentItem = CollidedItems[0]; - OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; - + int k = 0; do { + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) || currentItem->objectNumber == ID_LARA || (currentItem->flags & 0x40 && @@ -1352,22 +1332,39 @@ void ControlCrossbowBolt(short itemNumber) { if (CollidedItems[0]) { - ITEM_INFO* currentItem = CollidedItems[0]; - OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + // If explosive ammos selected and item hit, then blast everything + if (item->itemFlags[0] == CROSSBOW_EXPLODE) + explode = true; + ITEM_INFO* currentItem = CollidedItems[0]; + int k = 0; do { - if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE) - || currentItem->objectNumber == ID_LARA + OBJECT_INFO* currentObj = &Objects[currentItem->objectNumber]; + + if ((currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE && !currentObj->undead) + || (currentItem->objectNumber == ID_LARA && explode) || (currentItem->flags & 0x40 && (Objects[currentItem->objectNumber].explodableMeshbits || currentItem == LaraItem))) { - // All active intelligent creatures explode, if their HP is <= 0 - // Explosion is handled by CreatureDie() - // Also Lara can be damaged - // HitTarget() is called inside this - DoExplosiveDamageOnBaddie(currentItem, item, WEAPON_CROSSBOW); + if (explode) + { + // All active intelligent creatures explode, if their HP is <= 0 + // Explosion is handled by CreatureDie() + // Also Lara can be damaged + // HitTarget() is called inside this + DoExplosiveDamageOnBaddie(currentItem, item, WEAPON_CROSSBOW); + } + else if (currentItem->objectNumber != ID_LARA) + { + // Normal hit + HitTarget(currentItem, (GAME_VECTOR*)& item->pos, Weapons[WEAPON_CROSSBOW].damage << item->itemFlags[0], 0); + + // Poisoned ammos + if (item->itemFlags[0] == CROSSBOW_POISON) + currentItem->poisoned = true; + } } else if (currentItem->objectNumber >= ID_SMASH_OBJECT1 && currentItem->objectNumber <= ID_SMASH_OBJECT8) { From 34ded01687a1c8cc18ade1d21f2789996b34a861 Mon Sep 17 00:00:00 2001 From: Woops Date: Mon, 17 Aug 2020 15:10:29 -0500 Subject: [PATCH 20/22] fix SwapCrowbar --- TR5Main/Game/effect.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TR5Main/Game/effect.cpp b/TR5Main/Game/effect.cpp index 055456a70..f6d22275b 100644 --- a/TR5Main/Game/effect.cpp +++ b/TR5Main/Game/effect.cpp @@ -246,10 +246,10 @@ void ExplosionFX(ITEM_INFO* item)//39694(<), 39B94(<) (F) void SwapCrowbar(ITEM_INFO* item)//39638(<), 39B38(<) (F) { - if (Lara.meshPtrs[LM_RHAND] == Objects[ID_LARA].meshIndex + LM_RHAND) + if (Lara.meshPtrs[LM_RHAND] == Objects[ID_LARA_SKIN].meshIndex + LM_RHAND) Lara.meshPtrs[LM_RHAND] = Objects[ID_LARA_CROWBAR_ANIM].meshIndex + LM_RHAND; else - Lara.meshPtrs[LM_RHAND] = Objects[ID_LARA].meshIndex + LM_RHAND; + Lara.meshPtrs[LM_RHAND] = Objects[ID_LARA_SKIN].meshIndex + LM_RHAND; } void ActivateKey(ITEM_INFO* item)//39624(<), 39B24(<) (F) From 81ef017f9149bcefd2d11c3eb119a32d272da68d Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Tue, 18 Aug 2020 16:55:48 +0200 Subject: [PATCH 21/22] Improved a bit rooms load time; Fixed SPHINX; Fixed arms rotations with some weapons; --- TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp | 2 +- TR5Main/Renderer/Renderer11Compatibility.cpp | 195 ++++++++++--------- TR5Main/Renderer/Renderer11Lara.cpp | 6 +- 3 files changed, 103 insertions(+), 100 deletions(-) diff --git a/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp b/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp index 2cc235a83..f3dae73db 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp @@ -17,7 +17,7 @@ void InitialiseSphinx(short itemNumber) ClearItem(itemNumber); - item->animNumber = Objects[item->animNumber].animIndex + 1; + item->animNumber = Objects[item->objectNumber].animIndex + 1; item->frameNumber = g_Level.Anims[item->animNumber].frameBase; item->goalAnimState = 1; item->currentAnimState = 1; diff --git a/TR5Main/Renderer/Renderer11Compatibility.cpp b/TR5Main/Renderer/Renderer11Compatibility.cpp index 9ec9cdc54..e77088807 100644 --- a/TR5Main/Renderer/Renderer11Compatibility.cpp +++ b/TR5Main/Renderer/Renderer11Compatibility.cpp @@ -17,7 +17,7 @@ namespace T5M::Renderer m_moveableObjects.resize(ID_NUMBER_OBJECTS); m_spriteSequences.resize(ID_NUMBER_OBJECTS); m_staticObjects.resize(MAX_STATICS); - m_rooms = vector(NUM_ROOMS); + m_rooms.resize(g_Level.Rooms.size()); m_meshes.clear(); @@ -107,6 +107,7 @@ namespace T5M::Renderer //free(buffer); // Upload textures to GPU memory + m_roomTextures.resize(g_Level.RoomTextures.size()); for (int i = 0; i < g_Level.RoomTextures.size(); i++) { TEXTURE *texture = &g_Level.RoomTextures[i]; @@ -117,9 +118,10 @@ namespace T5M::Renderer normal = Texture2D(m_device.Get(), texture->normalMapData.data(), texture->normalMapData.size()); } TexturePair tex =std::make_tuple(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size()), normal); - m_roomTextures.push_back(tex); + m_roomTextures[i] = tex; } + m_moveablesTextures.resize(g_Level.MoveablesTextures.size()); for (int i = 0; i < g_Level.MoveablesTextures.size(); i++) { TEXTURE *texture = &g_Level.MoveablesTextures[i]; @@ -130,9 +132,10 @@ namespace T5M::Renderer normal = Texture2D(m_device.Get(), texture->normalMapData.data(), texture->normalMapData.size()); } TexturePair tex = std::make_tuple(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size()), normal); - m_moveablesTextures.push_back(tex); + m_moveablesTextures[i] = tex; } + m_staticsTextures.resize(g_Level.RoomTextures.size()); for (int i = 0; i < g_Level.StaticsTextures.size(); i++) { TEXTURE *texture = &g_Level.StaticsTextures[i]; @@ -143,13 +146,14 @@ namespace T5M::Renderer normal = Texture2D(m_device.Get(), texture->normalMapData.data(), texture->normalMapData.size()); } TexturePair tex = std::make_tuple(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size()), normal); - m_staticsTextures.push_back(tex); + m_staticsTextures[i] = tex; } + m_spritesTextures.resize(g_Level.SpritesTextures.size()); for (int i = 0; i < g_Level.SpritesTextures.size(); i++) { TEXTURE *texture = &g_Level.SpritesTextures[i]; - m_spritesTextures.push_back(Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size())); + m_spritesTextures[i] = Texture2D(m_device.Get(), texture->colorMapData.data(), texture->colorMapData.size()); } m_skyTexture = Texture2D(m_device.Get(), g_Level.MiscTextures.colorMapData.data(), g_Level.MiscTextures.colorMapData.size()); @@ -158,28 +162,30 @@ namespace T5M::Renderer vector roomVertices; vector roomIndices; - int baseRoomVertex = 0; - int baseRoomIndex = 0; + int totalRoomsVertices = 0; + int totalRoomsIndices = 0; for (int i = 0; i < g_Level.Rooms.size(); i++) { - ROOM_INFO *room = &g_Level.Rooms[i]; + ROOM_INFO* room = &g_Level.Rooms[i]; - m_rooms[i] = RendererRoom(); - RendererRoom &r = m_rooms[i]; - r.RoomNumber = i; - r.Room = room; - r.AmbientLight = Vector4(room->ambient.x, room->ambient.y, room->ambient.z, 1.0f); + RendererRoom* r = &m_rooms[i]; + r->RoomNumber = i; + r->Room = room; + r->AmbientLight = Vector4(room->ambient.x, room->ambient.y, room->ambient.z, 1.0f); //r.LightsToDraw = vector(MAX_LIGHTS); - r.Statics.resize(room->mesh.size()); + r->Statics.resize(room->mesh.size()); if (room->positions.size() == 0) continue; + int baseRoomVertex = 0; + int baseRoomIndex = 0; + for (int n = 0; n < room->buckets.size(); n++) { - BUCKET *levelBucket = &room->buckets[n]; - RendererBucket *bucket; + BUCKET* levelBucket = &room->buckets[n]; + RendererBucket* bucket; int bucketIndex; if (levelBucket->blendMode != 0) @@ -187,125 +193,140 @@ namespace T5M::Renderer else bucketIndex = RENDERER_BUCKET_SOLID; - bucket = &r.Buckets[bucketIndex]; + bucket = &r->Buckets[bucketIndex]; - bucket->Vertices.reserve(levelBucket->numQuads * 4 + levelBucket->numTriangles * 3); - bucket->Indices.reserve(levelBucket->numQuads * 6 + levelBucket->numTriangles * 3); + bucket->Vertices.resize(levelBucket->numQuads * 4 + levelBucket->numTriangles * 3); + bucket->Indices.resize(levelBucket->numQuads * 6 + levelBucket->numTriangles * 3); + + int lastVertex = 0; + int lastIndex = 0; for (int p = 0; p < levelBucket->polygons.size(); p++) { POLYGON* poly = &levelBucket->polygons[p]; - int baseVertices = bucket->Vertices.size(); + int baseVertices = lastVertex; for (int k = 0; k < poly->indices.size(); k++) { - RendererVertex vertex; + RendererVertex* vertex = &bucket->Vertices[lastVertex]; int v = poly->indices[k]; - vertex.Position.x = room->x + room->positions[v].x; - vertex.Position.y = room->y + room->positions[v].y; - vertex.Position.z = room->z + room->positions[v].z; + vertex->Position.x = room->x + room->positions[v].x; + vertex->Position.y = room->y + room->positions[v].y; + vertex->Position.z = room->z + room->positions[v].z; - vertex.Normal = poly->normals[k]; - vertex.UV = poly->textureCoordinates[k]; - vertex.Color = Vector4(room->colors[v].x, room->colors[v].y, room->colors[v].z,1.0f); - vertex.Tangent = poly->tangents[k]; - vertex.BiTangent = poly->bitangents[k]; + vertex->Normal = poly->normals[k]; + vertex->UV = poly->textureCoordinates[k]; + vertex->Color = Vector4(room->colors[v].x, room->colors[v].y, room->colors[v].z, 1.0f); + vertex->Tangent = poly->tangents[k]; + vertex->BiTangent = poly->bitangents[k]; - vertex.Bone = 0; + vertex->Bone = 0; - bucket->Vertices.push_back(vertex); + lastVertex++; + totalRoomsVertices++; } if (poly->shape == 0) { - bucket->Indices.push_back(baseVertices); - bucket->Indices.push_back(baseVertices + 1); - bucket->Indices.push_back(baseVertices + 3); - bucket->Indices.push_back(baseVertices + 2); - bucket->Indices.push_back(baseVertices + 3); - bucket->Indices.push_back(baseVertices + 1); + bucket->Indices[lastIndex + 0] = baseVertices + 0; //.push_back(baseVertices); + bucket->Indices[lastIndex + 1] = baseVertices + 1; //.push_back(baseVertices + 1); + bucket->Indices[lastIndex + 2] = baseVertices + 3; //.push_back(baseVertices + 3); + bucket->Indices[lastIndex + 3] = baseVertices + 2; //.push_back(baseVertices + 2); + bucket->Indices[lastIndex + 4] = baseVertices + 3; //.push_back(baseVertices + 3); + bucket->Indices[lastIndex + 5] = baseVertices + 1; //.push_back(baseVertices + 1); + + lastIndex += 6; + totalRoomsIndices += 6; } else { - bucket->Indices.push_back(baseVertices); - bucket->Indices.push_back(baseVertices + 1); - bucket->Indices.push_back(baseVertices + 2); + bucket->Indices[lastIndex + 0] = baseVertices + 0; //.push_back(baseVertices); + bucket->Indices[lastIndex + 1] = baseVertices + 1; //.push_back(baseVertices + 1); + bucket->Indices[lastIndex + 2] = baseVertices + 2; //.push_back(baseVertices + 2); + + lastIndex += 3; + totalRoomsIndices += 3; } } } if (room->lights.size() != 0) { + r->Lights.resize(room->lights.size()); for (int l = 0; l < room->lights.size(); l++) { - RendererLight light; - ROOM_LIGHT *oldLight = &room->lights[l]; + RendererLight* light = &r->Lights[l]; + ROOM_LIGHT* oldLight = &room->lights[l]; if (oldLight->type == LIGHT_TYPES::LIGHT_TYPE_SUN) { - light.Color = Vector3(oldLight->r, oldLight->g, oldLight->b); - light.Direction = Vector4(oldLight->dx, oldLight->dy, oldLight->dz, 1.0f); - light.Type = LIGHT_TYPES::LIGHT_TYPE_SUN; - light.Intensity = 1.0f; - - r.Lights.push_back(light); + light->Color = Vector3(oldLight->r, oldLight->g, oldLight->b); + light->Direction = Vector4(oldLight->dx, oldLight->dy, oldLight->dz, 1.0f); + light->Type = LIGHT_TYPES::LIGHT_TYPE_SUN; + light->Intensity = 1.0f; } else if (oldLight->type == LIGHT_TYPE_POINT) { - light.Position = Vector3(oldLight->x, oldLight->y, oldLight->z); - light.Color = Vector3(oldLight->r, oldLight->g, oldLight->b); - light.Direction = Vector4(oldLight->dx, oldLight->dy, oldLight->dz, 1.0f); - light.Intensity = 1.0f; - light.In = oldLight->in; - light.Out = oldLight->out; - light.Type = LIGHT_TYPE_POINT; - - r.Lights.push_back(light); + light->Position = Vector3(oldLight->x, oldLight->y, oldLight->z); + light->Color = Vector3(oldLight->r, oldLight->g, oldLight->b); + light->Direction = Vector4(oldLight->dx, oldLight->dy, oldLight->dz, 1.0f); + light->Intensity = 1.0f; + light->In = oldLight->in; + light->Out = oldLight->out; + light->Type = LIGHT_TYPE_POINT; } else if (oldLight->type == LIGHT_TYPE_SHADOW) { - light.Position = Vector3(oldLight->x, oldLight->y, oldLight->z); - light.Color = Vector3(oldLight->r, oldLight->g, oldLight->b); - light.In = oldLight->in; - light.Out = oldLight->out; - light.Type = LIGHT_TYPE_SHADOW; - light.Intensity = 1.0f; - - r.Lights.push_back(light); + light->Position = Vector3(oldLight->x, oldLight->y, oldLight->z); + light->Color = Vector3(oldLight->r, oldLight->g, oldLight->b); + light->In = oldLight->in; + light->Out = oldLight->out; + light->Type = LIGHT_TYPE_SHADOW; + light->Intensity = 1.0f; } else if (oldLight->type == LIGHT_TYPE_SPOT) { - light.Position = Vector3(oldLight->x, oldLight->y, oldLight->z); - light.Color = Vector3(oldLight->r, oldLight->g, oldLight->b); - light.Direction = Vector4(oldLight->dx, oldLight->dy, oldLight->dz, 1.0f); - light.Intensity = 1.0f; - light.In = oldLight->in; - light.Out = oldLight->out; - light.Range = oldLight->length; - light.Type = LIGHT_TYPE_SPOT; - - r.Lights.push_back(light); + light->Position = Vector3(oldLight->x, oldLight->y, oldLight->z); + light->Color = Vector3(oldLight->r, oldLight->g, oldLight->b); + light->Direction = Vector4(oldLight->dx, oldLight->dy, oldLight->dz, 1.0f); + light->Intensity = 1.0f; + light->In = oldLight->in; + light->Out = oldLight->out; + light->Range = oldLight->length; + light->Type = LIGHT_TYPE_SPOT; } oldLight++; } } + } + + roomVertices.resize(totalRoomsVertices); + roomIndices.resize(totalRoomsIndices); + + int baseRoomVertex = 0; + int baseRoomIndex = 0; + + for (int i = 0; i < g_Level.Rooms.size(); i++) + { + ROOM_INFO* room = &g_Level.Rooms[i]; + RendererRoom* r = &m_rooms[i]; // Merge vertices and indices in a single list for (int j = 0; j < NUM_BUCKETS; j++) { - RendererBucket *bucket = &r.Buckets[j]; + RendererBucket *bucket = &r->Buckets[j]; bucket->StartVertex = baseRoomVertex; bucket->StartIndex = baseRoomIndex; for (int k = 0; k < bucket->Vertices.size(); k++) - roomVertices.push_back(bucket->Vertices[k]); + roomVertices[baseRoomVertex + k] = bucket->Vertices[k]; for (int k = 0; k < bucket->Indices.size(); k++) - roomIndices.push_back(baseRoomVertex + bucket->Indices[k]); + roomIndices[baseRoomIndex + k] = baseRoomVertex + bucket->Indices[k]; baseRoomVertex += bucket->Vertices.size(); baseRoomIndex += bucket->Indices.size(); @@ -339,24 +360,6 @@ namespace T5M::Renderer m_moveableObjects[MoveablesIds[i]] = RendererObject(); RendererObject &moveable = *m_moveableObjects[MoveablesIds[i]]; moveable.Id = MoveablesIds[i]; - - // Assign the draw routine - /*if (objNum == ID_FLAME || objNum == ID_FLAME_EMITTER || objNum == ID_FLAME_EMITTER2 || objNum == ID_FLAME_EMITTER3 || - objNum == ID_TRIGGER_TRIGGERER || objNum == ID_TIGHT_ROPE || objNum == ID_AI_AMBUSH || - objNum == ID_AI_FOLLOW || objNum == ID_AI_GUARD || objNum == ID_AI_MODIFY || - objNum == ID_AI_PATROL1 || objNum == ID_AI_PATROL2 || objNum == ID_AI_X1 || - objNum == ID_AI_X2 || objNum == ID_DART_EMITTER || objNum == ID_HOMING_DART_EMITTER || - objNum == ID_ROPE || objNum == ID_KILL_ALL_TRIGGERS || objNum == ID_EARTHQUAKE || - objNum == ID_CAMERA_TARGET || objNum == ID_WATERFALLMIST || objNum == ID_SMOKE_EMITTER_BLACK || - objNum == ID_SMOKE_EMITTER_WHITE) - { - moveable.DoNotDraw = true; - } - else - { - moveable.DoNotDraw = false; - }*/ - moveable.DoNotDraw = (obj->drawRoutine == NULL); for (int j = 0; j < obj->nmeshes; j++) diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 6cdef9615..5ddbc7fee 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -65,8 +65,8 @@ void Renderer11::updateLaraAnimations(bool force) else { // While handling weapon some extra rotation could be applied to arms - laraObj.LinearizedBones[LM_LINARM]->ExtraRotation += Vector3(TO_RAD(Lara.leftArm.xRot), TO_RAD(Lara.leftArm.zRot), TO_RAD(-Lara.leftArm.yRot)); - laraObj.LinearizedBones[LM_RINARM]->ExtraRotation += Vector3(TO_RAD(Lara.rightArm.xRot), TO_RAD(Lara.rightArm.zRot), TO_RAD(-Lara.rightArm.yRot)); + laraObj.LinearizedBones[LM_LINARM]->ExtraRotation += Vector3(TO_RAD(Lara.leftArm.xRot), TO_RAD(-Lara.leftArm.yRot), TO_RAD(Lara.leftArm.zRot)); + laraObj.LinearizedBones[LM_RINARM]->ExtraRotation += Vector3(TO_RAD(Lara.rightArm.xRot), TO_RAD(-Lara.rightArm.yRot), TO_RAD(Lara.rightArm.zRot)); LARA_ARM *leftArm = &Lara.leftArm; LARA_ARM *rightArm = &Lara.rightArm; @@ -80,6 +80,7 @@ void Renderer11::updateLaraAnimations(bool force) case WEAPON_GRENADE_LAUNCHER: case WEAPON_ROCKET_LAUNCHER: case WEAPON_HARPOON_GUN: + case WEAPON_REVOLVER: ANIM_FRAME* shotgunFramePtr; // Left arm @@ -95,7 +96,6 @@ void Renderer11::updateLaraAnimations(bool force) case WEAPON_PISTOLS: case WEAPON_UZI: - case WEAPON_REVOLVER: default: { ANIM_FRAME* pistolFramePtr; From cb96f011f90abd544bdc7b8c80c4227549ff89e0 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Tue, 18 Aug 2020 20:26:24 +0200 Subject: [PATCH 22/22] Displaying Commit Message on Title --- TR5Main/Renderer/Renderer11.h | 2 +- TR5Main/Renderer/Renderer11Draw.cpp | 3 ++ TR5Main/Renderer/Renderer11String.cpp | 2 +- TR5Main/Specific/winmain.cpp | 59 ++++++++++++++++++++++++++- TR5Main/Specific/winmain.h | 6 ++- TR5Main/TR5Main.vcxproj | 4 +- TR5Main/TR5Main.vcxproj.filters | 15 +++++++ 7 files changed, 85 insertions(+), 6 deletions(-) diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index 73ed2e313..c3e76b910 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -625,7 +625,7 @@ namespace T5M::Renderer void renderScene(ID3D11RenderTargetView* target, ID3D11DepthStencilView* depthTarget, RenderView& view); void drawPickup(short objectNum); int SyncRenderer(); - void drawString(int x, int y, char* string, D3DCOLOR color, int flags); + void drawString(int x, int y, const char* string, D3DCOLOR color, int flags); void clearDynamicLights(); void addDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b); void freeRendererData(); diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index f8d14f3e1..7a784d93a 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -23,6 +23,7 @@ #include #include "RenderView/RenderView.h" #include "hair.h" +#include "winmain.h" extern T5M::Renderer::RendererHUDBar *g_DashBar; extern T5M::Renderer::RendererHUDBar *g_SFXVolumeBar; extern T5M::Renderer::RendererHUDBar *g_MusicVolumeBar; @@ -1907,6 +1908,8 @@ namespace T5M::Renderer m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_STENCIL | D3D11_CLEAR_DEPTH, 1.0f, 0); renderInventoryScene(m_backBufferRTV, m_depthStencilView, nullptr); + drawString(0, 0, commit.c_str(), D3DCOLOR_ARGB(255, 255,255, 255), 0); + drawAllStrings(); m_swapChain->Present(0, 0); } diff --git a/TR5Main/Renderer/Renderer11String.cpp b/TR5Main/Renderer/Renderer11String.cpp index ca1b33ce9..195178dfd 100644 --- a/TR5Main/Renderer/Renderer11String.cpp +++ b/TR5Main/Renderer/Renderer11String.cpp @@ -1,7 +1,7 @@ #include "framework.h" #include "Renderer11.h" namespace T5M::Renderer { - void Renderer11::drawString(int x, int y, char* string, D3DCOLOR color, int flags) { + void Renderer11::drawString(int x, int y, const char* string, D3DCOLOR color, int flags) { int realX = x; int realY = y; float factorX = ScreenWidth / 800.0f; diff --git a/TR5Main/Specific/winmain.cpp b/TR5Main/Specific/winmain.cpp index d3223bffc..1264675a3 100644 --- a/TR5Main/Specific/winmain.cpp +++ b/TR5Main/Specific/winmain.cpp @@ -31,7 +31,9 @@ extern GameConfiguration g_Configuration; DWORD DebugConsoleThreadID; DWORD MainThreadID; bool BlockAllInput = true; - +#if _DEBUG +string commit; +#endif int lua_exception_handler(lua_State* L, sol::optional maybe_exception, sol::string_view description) { return luaL_error(L, description.data()); @@ -77,6 +79,59 @@ void CALLBACK HandleWmCommand(unsigned short wParam) } } +void getCurrentCommit() { + LPSTR cmdLine = {TEXT("git.exe log -1 --oneline")}; + + SECURITY_ATTRIBUTES sa = {0}; + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + + HANDLE hStdOutRd, hStdOutWr; + HANDLE hStdErrRd, hStdErrWr; + + if(!CreatePipe(&hStdOutRd, &hStdOutWr, &sa, 0)){ + // error handling... + } + + if(!CreatePipe(&hStdErrRd, &hStdErrWr, &sa, 0)){ + // error handling... + } + + SetHandleInformation(hStdOutRd, HANDLE_FLAG_INHERIT, 0); + SetHandleInformation(hStdErrRd, HANDLE_FLAG_INHERIT, 0); + + STARTUPINFO si = {}; + si.cb = sizeof(si); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + si.hStdOutput = hStdOutWr; + si.hStdError = hStdErrWr; + + PROCESS_INFORMATION pi = {}; + + if(!CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)){ + // error handling... + } else{ + CHAR buf[256]; + DWORD n; + BOOL success = ReadFile(hStdOutRd, buf, 256, &n, NULL); + if(!success || n == 0){ + std::cout << "Failed to call ReadFile" << std::endl; + } + commit = std::string(buf, buf + n); + // read from hStdOutRd and hStdErrRd as needed until the process is terminated... + + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + } + + CloseHandle(hStdOutRd); + CloseHandle(hStdOutWr); + CloseHandle(hStdErrRd); + CloseHandle(hStdErrWr); +} + void HandleScriptMessage(WPARAM wParam) { string ErrorMessage; @@ -161,6 +216,8 @@ LRESULT CALLBACK WinAppProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { + if constexpr (DebugBuild) + getCurrentCommit(); int RetVal; int n; diff --git a/TR5Main/Specific/winmain.h b/TR5Main/Specific/winmain.h index d51375ae1..f49375af8 100644 --- a/TR5Main/Specific/winmain.h +++ b/TR5Main/Specific/winmain.h @@ -22,6 +22,9 @@ extern unsigned int ThreadID; extern uintptr_t ThreadHandle; extern HACCEL hAccTable; extern HWND WindowsHandle; +#if _DEBUG +extern std::string commit; +#endif // return handle #define BeginThread(function, threadid) _beginthreadex(0, 0, &function, 0, 0, &threadid) @@ -32,4 +35,5 @@ void WinProcMsg(); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); void WinClose(); LRESULT CALLBACK WinAppProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); -void CALLBACK HandleWmCommand(unsigned short wParam); \ No newline at end of file +void CALLBACK HandleWmCommand(unsigned short wParam); +void getCurrentCommit(); \ No newline at end of file diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 447a6fc92..f24a77776 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -15,14 +15,14 @@ {15AB0220-541C-4DA1-94EB-ED3C47E4582E} Win32Proj TR5Main - 10.0 + 10.0.19041.0 Application true MultiByte - v142 + v141 Application diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index 9b34cbadd..2f9479f1e 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -852,6 +852,15 @@ File di intestazione + + File di intestazione + + + File di intestazione + + + File di intestazione + @@ -1553,6 +1562,12 @@ File di origine + + File di origine + + + File di origine +