From 6f121471e3f196609f11896264a3f662e1a24673 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Mon, 29 Jun 2026 15:36:56 -0400 Subject: [PATCH 1/3] refactor(w3dview): Migrate AssetInfo, ScreenCursor and PlaySoundDialog to RefCountPtr --- Core/Tools/W3DView/AssetInfo.cpp | 2 +- Core/Tools/W3DView/AssetInfo.h | 17 ++++++++--------- Core/Tools/W3DView/PlaySoundDialog.cpp | 5 ++--- Core/Tools/W3DView/PlaySoundDialog.h | 3 ++- Core/Tools/W3DView/ScreenCursor.cpp | 16 ++++------------ Core/Tools/W3DView/ScreenCursor.h | 5 +++-- 6 files changed, 20 insertions(+), 28 deletions(-) diff --git a/Core/Tools/W3DView/AssetInfo.cpp b/Core/Tools/W3DView/AssetInfo.cpp index 4a4d7ee07b0..bc2140be612 100644 --- a/Core/Tools/W3DView/AssetInfo.cpp +++ b/Core/Tools/W3DView/AssetInfo.cpp @@ -52,7 +52,7 @@ AssetInfoClass::Initialize () if (m_AssetType != TypeMaterial) { // Assume we are wrapping an instance as apposed to an asset 'name'. - RenderObjClass *prender_obj = m_pRenderObj; + RenderObjClass *prender_obj = m_pRenderObj.Peek(); if (prender_obj) prender_obj->Add_Ref(); diff --git a/Core/Tools/W3DView/AssetInfo.h b/Core/Tools/W3DView/AssetInfo.h index 68fea267f27..5d2001f10d8 100644 --- a/Core/Tools/W3DView/AssetInfo.h +++ b/Core/Tools/W3DView/AssetInfo.h @@ -37,7 +37,7 @@ #pragma once #include "rendobj.h" -#include "Utils.h" +#include "ref_ptr.h" #include "AssetTypes.h" @@ -58,16 +58,15 @@ class AssetInfoClass // AssetInfoClass () : m_AssetType (TypeUnknown), - m_dwUserData (0L), - m_pRenderObj (nullptr) { Initialize (); } + m_dwUserData (0L) { Initialize (); } AssetInfoClass (LPCTSTR passet_name, ASSET_TYPE type, RenderObjClass *prender_obj = nullptr, DWORD user_data = 0L) : m_Name (passet_name), m_AssetType (type), m_dwUserData (user_data), - m_pRenderObj (nullptr) { REF_PTR_SET (m_pRenderObj, prender_obj); Initialize (); } + m_pRenderObj (RefCountPtr::Create_AddRef(prender_obj)) { Initialize (); } - virtual ~AssetInfoClass () { REF_PTR_RELEASE (m_pRenderObj); } + virtual ~AssetInfoClass () {} ////////////////////////////////////////////////////////////// // @@ -83,14 +82,14 @@ class AssetInfoClass ASSET_TYPE Get_Type () const { return m_AssetType; } DWORD Get_User_Number () const { return m_dwUserData; } const CString & Get_User_String () const { return m_UserString; } - RenderObjClass * Get_Render_Obj () const { if (m_pRenderObj) m_pRenderObj->Add_Ref(); return m_pRenderObj; } - RenderObjClass * Peek_Render_Obj () const { return m_pRenderObj; } + RenderObjClass * Get_Render_Obj () const { RenderObjClass *ptr = m_pRenderObj.Peek(); if (ptr) ptr->Add_Ref(); return ptr; } + RenderObjClass * Peek_Render_Obj () const { return m_pRenderObj.Peek(); } void Set_Name (LPCTSTR pname) { m_Name = pname; } void Set_Hierarchy_Name (LPCTSTR pname) { m_HierarchyName = pname; } void Set_Type (ASSET_TYPE type) { m_AssetType = type; } void Set_User_Number (DWORD user_data) { m_dwUserData = user_data; } void Set_User_String (LPCTSTR string) { m_UserString = string; } - void Set_Render_Obj (RenderObjClass *pobj) { REF_PTR_SET (m_pRenderObj, pobj); } + void Set_Render_Obj (RenderObjClass *pobj) { m_pRenderObj = RefCountPtr::Create_AddRef(pobj); } // // Information methods @@ -118,5 +117,5 @@ class AssetInfoClass CString m_OriginalName; ASSET_TYPE m_AssetType; DWORD m_dwUserData; - RenderObjClass * m_pRenderObj; + RefCountPtr m_pRenderObj; }; diff --git a/Core/Tools/W3DView/PlaySoundDialog.cpp b/Core/Tools/W3DView/PlaySoundDialog.cpp index 8037d793645..5272e99c950 100644 --- a/Core/Tools/W3DView/PlaySoundDialog.cpp +++ b/Core/Tools/W3DView/PlaySoundDialog.cpp @@ -39,7 +39,6 @@ static char THIS_FILE[] = __FILE__; ///////////////////////////////////////////////////////////////////////////// PlaySoundDialogClass::PlaySoundDialogClass(LPCTSTR filename, CWnd* pParent /*=nullptr*/) : Filename (filename), - SoundObj (nullptr), CDialog(PlaySoundDialogClass::IDD, pParent) { //{{AFX_DATA_INIT(PlaySoundDialogClass) @@ -96,7 +95,7 @@ void PlaySoundDialogClass::OnCancel () { SoundObj->Stop (); - REF_PTR_RELEASE (SoundObj); + SoundObj.Clear(); CDialog::OnCancel (); } @@ -120,7 +119,7 @@ PlaySoundDialogClass::OnInitDialog () // // Create the sound effect so we can play it // - SoundObj = WWAudioClass::Get_Instance ()->Create_Sound_Effect (Filename); + SoundObj = RefCountPtr::Create_NoAddRef(WWAudioClass::Get_Instance ()->Create_Sound_Effect (Filename)); if (SoundObj == nullptr) { CString message; message.Format ("Cannot find sound file: %s!", (LPCTSTR)Filename, MB_OK); diff --git a/Core/Tools/W3DView/PlaySoundDialog.h b/Core/Tools/W3DView/PlaySoundDialog.h index 265b8878942..1fe26ff1b9c 100644 --- a/Core/Tools/W3DView/PlaySoundDialog.h +++ b/Core/Tools/W3DView/PlaySoundDialog.h @@ -20,6 +20,7 @@ #include "resource.h" #include "WWAudio.h" +#include "ref_ptr.h" ///////////////////////////////////////////////////////////////////////////// @@ -61,7 +62,7 @@ class PlaySoundDialogClass : public CDialog private: CString Filename; - AudibleSoundClass * SoundObj; + RefCountPtr SoundObj; }; //{{AFX_INSERT_LOCATION}} diff --git a/Core/Tools/W3DView/ScreenCursor.cpp b/Core/Tools/W3DView/ScreenCursor.cpp index 32eb640dcc0..f94e0fa47b1 100644 --- a/Core/Tools/W3DView/ScreenCursor.cpp +++ b/Core/Tools/W3DView/ScreenCursor.cpp @@ -53,8 +53,6 @@ /////////////////////////////////////////////////////////////////// ScreenCursorClass::ScreenCursorClass () : m_ScreenPos (0, 0), - m_pTexture (nullptr), - m_pVertMaterial (nullptr), m_Width (0), m_Height (0), m_hWnd (nullptr) @@ -70,9 +68,7 @@ ScreenCursorClass::ScreenCursorClass () /////////////////////////////////////////////////////////////////// ScreenCursorClass::ScreenCursorClass (const ScreenCursorClass &src) : m_ScreenPos (0, 0), - m_pTexture (nullptr), m_hWnd (nullptr), - m_pVertMaterial (nullptr), m_Width (0), m_Height (0), RenderObjClass (src) @@ -88,8 +84,6 @@ ScreenCursorClass::ScreenCursorClass (const ScreenCursorClass &src) /////////////////////////////////////////////////////////////////// ScreenCursorClass::~ScreenCursorClass () { - REF_PTR_RELEASE (m_pTexture); - REF_PTR_RELEASE (m_pVertMaterial); } @@ -101,10 +95,8 @@ ScreenCursorClass::~ScreenCursorClass () void ScreenCursorClass::Initialize () { - REF_PTR_RELEASE(m_pVertMaterial); - // Create default vertex material - m_pVertMaterial = NEW_REF( VertexMaterialClass, ()); + m_pVertMaterial = RefCountPtr::Create_NoAddRef(NEW_REF( VertexMaterialClass, ())); m_pVertMaterial->Set_Diffuse (1.0F, 1.0F, 1.0F); m_pVertMaterial->Set_Emissive (0.0F, 0.0F, 0.0F); m_pVertMaterial->Set_Specular (1.0F, 1.0F, 1.0F); @@ -149,7 +141,7 @@ ScreenCursorClass::Initialize () void ScreenCursorClass::Set_Texture (TextureClass *texture) { - REF_PTR_SET (m_pTexture, texture); + m_pTexture = RefCountPtr::Create_AddRef(texture); // Find the dimensions of the texture: if (m_pTexture != nullptr) { @@ -296,9 +288,9 @@ ScreenCursorClass::Render (RenderInfoClass &rinfo) /* ** Apply the shader and material */ - DX8Wrapper::Set_Material(m_pVertMaterial); + DX8Wrapper::Set_Material(m_pVertMaterial.Peek()); DX8Wrapper::Set_Shader(ShaderClass::_PresetATestBlend2DShader); - DX8Wrapper::Set_Texture(0,m_pTexture); + DX8Wrapper::Set_Texture(0,m_pTexture.Peek()); DX8Wrapper::Set_Vertex_Buffer(vbaccess); DX8Wrapper::Set_Index_Buffer(ibaccess,0); diff --git a/Core/Tools/W3DView/ScreenCursor.h b/Core/Tools/W3DView/ScreenCursor.h index 3ffacdda703..d036aae86ad 100644 --- a/Core/Tools/W3DView/ScreenCursor.h +++ b/Core/Tools/W3DView/ScreenCursor.h @@ -35,6 +35,7 @@ #include "resource.h" #include "rendobj.h" #include "Vector3i.h" +#include "ref_ptr.h" // Forward declarations class VertexMaterialClass; @@ -93,8 +94,8 @@ class ScreenCursorClass : public RenderObjClass //////////////////////////////////////////////////////////////////////// HWND m_hWnd; Vector2 m_ScreenPos; - TextureClass * m_pTexture; - VertexMaterialClass *m_pVertMaterial; + RefCountPtr m_pTexture; + RefCountPtr m_pVertMaterial; Vector3 m_Verticies[4]; Vector3 m_Normals[4]; From 175b9f0910c46d69f3805c26355ab77b7a3ffc02 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Mon, 29 Jun 2026 15:36:56 -0400 Subject: [PATCH 2/3] refactor(w3dview): Migrate Sphere and Ring property sheets to RefCountPtr --- Core/Tools/W3DView/RingPropertySheet.cpp | 31 ++++++++++------------ Core/Tools/W3DView/RingPropertySheet.h | 3 ++- Core/Tools/W3DView/SpherePropertySheet.cpp | 31 ++++++++++------------ Core/Tools/W3DView/SpherePropertySheet.h | 3 ++- 4 files changed, 32 insertions(+), 36 deletions(-) diff --git a/Core/Tools/W3DView/RingPropertySheet.cpp b/Core/Tools/W3DView/RingPropertySheet.cpp index 014e55e512b..38b62b9f377 100644 --- a/Core/Tools/W3DView/RingPropertySheet.cpp +++ b/Core/Tools/W3DView/RingPropertySheet.cpp @@ -48,10 +48,9 @@ RingPropertySheetClass::RingPropertySheetClass CWnd * pParentWnd, UINT iSelectPage ) - : m_RenderObj (nullptr), - CPropertySheet(nIDCaption, pParentWnd, iSelectPage) + : CPropertySheet(nIDCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(ring)) { - REF_PTR_SET (m_RenderObj, ring); Initialize (); } @@ -68,10 +67,9 @@ RingPropertySheetClass::RingPropertySheetClass CWnd * pParentWnd, UINT iSelectPage ) - : m_RenderObj (nullptr), - CPropertySheet(pszCaption, pParentWnd, iSelectPage) + : CPropertySheet(pszCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(ring)) { - REF_PTR_SET (m_RenderObj, ring); Initialize (); } @@ -83,7 +81,6 @@ RingPropertySheetClass::RingPropertySheetClass ///////////////////////////////////////////////////////////////////////////// RingPropertySheetClass::~RingPropertySheetClass () { - REF_PTR_RELEASE (m_RenderObj); } @@ -180,7 +177,7 @@ RingPropertySheetClass::Add_Object_To_Viewer () // // Create a new prototype for this object // - RingPrototypeClass *prototype = new RingPrototypeClass (m_RenderObj); + RingPrototypeClass *prototype = new RingPrototypeClass (m_RenderObj.Peek()); // // Update the asset manager with the new prototype @@ -201,14 +198,14 @@ RingPropertySheetClass::Add_Object_To_Viewer () // doc->Reload_Displayed_Object (); m_LastSavedName = m_RenderObj->Get_Name (); - REF_PTR_SET (m_RenderObj, (RingRenderObjClass *)doc->GetDisplayedObject ()); + m_RenderObj = RefCountPtr::Create_AddRef((RingRenderObjClass *)doc->GetDisplayedObject ()); // // Pass the object along to the pages // - m_GeneralPage.Set_Ring (m_RenderObj); - m_ColorPage.Set_Ring (m_RenderObj); - m_ScalePage.Set_Ring (m_RenderObj); + m_GeneralPage.Set_Ring (m_RenderObj.Peek()); + m_ColorPage.Set_Ring (m_RenderObj.Peek()); + m_ScalePage.Set_Ring (m_RenderObj.Peek()); } } @@ -242,9 +239,9 @@ RingPropertySheetClass::Initialize () // // Pass the object along to the pages // - m_GeneralPage.Set_Ring (m_RenderObj); - m_ColorPage.Set_Ring (m_RenderObj); - m_ScalePage.Set_Ring (m_RenderObj); + m_GeneralPage.Set_Ring (m_RenderObj.Peek()); + m_ColorPage.Set_Ring (m_RenderObj.Peek()); + m_ScalePage.Set_Ring (m_RenderObj.Peek()); // // Add the pages to the sheet @@ -270,12 +267,12 @@ RingPropertySheetClass::Initialize () void RingPropertySheetClass::Create_New_Object () { - m_RenderObj = new RingRenderObjClass; + m_RenderObj = RefCountPtr::Create_NoAddRef(new RingRenderObjClass); m_RenderObj->Set_Name ("Ring"); // // Display the new object // - ::GetCurrentDocument ()->DisplayObject (m_RenderObj); + ::GetCurrentDocument ()->DisplayObject (m_RenderObj.Peek()); } diff --git a/Core/Tools/W3DView/RingPropertySheet.h b/Core/Tools/W3DView/RingPropertySheet.h index 1ed8f9c9570..82a5ffe1760 100644 --- a/Core/Tools/W3DView/RingPropertySheet.h +++ b/Core/Tools/W3DView/RingPropertySheet.h @@ -39,6 +39,7 @@ #include "RingColorPropPage.h" #include "RingGeneralPropPage.h" #include "RingSizePropPage.h" +#include "ref_ptr.h" // Forward declarations @@ -109,7 +110,7 @@ class RingPropertySheetClass : public CPropertySheet RingGeneralPropPageClass m_GeneralPage; RingColorPropPageClass m_ColorPage; RingSizePropPageClass m_ScalePage; - RingRenderObjClass * m_RenderObj; + RefCountPtr m_RenderObj; CString m_LastSavedName; }; diff --git a/Core/Tools/W3DView/SpherePropertySheet.cpp b/Core/Tools/W3DView/SpherePropertySheet.cpp index b2996971638..04631542df2 100644 --- a/Core/Tools/W3DView/SpherePropertySheet.cpp +++ b/Core/Tools/W3DView/SpherePropertySheet.cpp @@ -48,10 +48,9 @@ SpherePropertySheetClass::SpherePropertySheetClass CWnd * pParentWnd, UINT iSelectPage ) - : m_RenderObj (nullptr), - CPropertySheet(nIDCaption, pParentWnd, iSelectPage) + : CPropertySheet(nIDCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(sphere)) { - REF_PTR_SET (m_RenderObj, sphere); Initialize (); } @@ -68,10 +67,9 @@ SpherePropertySheetClass::SpherePropertySheetClass CWnd * pParentWnd, UINT iSelectPage ) - : m_RenderObj (nullptr), - CPropertySheet(pszCaption, pParentWnd, iSelectPage) + : CPropertySheet(pszCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(sphere)) { - REF_PTR_SET (m_RenderObj, sphere); Initialize (); } @@ -83,7 +81,6 @@ SpherePropertySheetClass::SpherePropertySheetClass ///////////////////////////////////////////////////////////////////////////// SpherePropertySheetClass::~SpherePropertySheetClass () { - REF_PTR_RELEASE (m_RenderObj); } @@ -180,7 +177,7 @@ SpherePropertySheetClass::Add_Object_To_Viewer () // // Create a new prototype for this object // - SpherePrototypeClass *prototype = new SpherePrototypeClass (m_RenderObj); + SpherePrototypeClass *prototype = new SpherePrototypeClass (m_RenderObj.Peek()); // // Update the asset manager with the new prototype @@ -201,14 +198,14 @@ SpherePropertySheetClass::Add_Object_To_Viewer () // doc->Reload_Displayed_Object (); m_LastSavedName = m_RenderObj->Get_Name (); - REF_PTR_SET (m_RenderObj, (SphereRenderObjClass *)doc->GetDisplayedObject ()); + m_RenderObj = RefCountPtr::Create_AddRef((SphereRenderObjClass *)doc->GetDisplayedObject ()); // // Pass the object along to the pages // - m_GeneralPage.Set_Sphere (m_RenderObj); - m_ColorPage.Set_Sphere (m_RenderObj); - m_ScalePage.Set_Sphere (m_RenderObj); + m_GeneralPage.Set_Sphere (m_RenderObj.Peek()); + m_ColorPage.Set_Sphere (m_RenderObj.Peek()); + m_ScalePage.Set_Sphere (m_RenderObj.Peek()); } } @@ -242,9 +239,9 @@ SpherePropertySheetClass::Initialize () // // Pass the object along to the pages // - m_GeneralPage.Set_Sphere (m_RenderObj); - m_ColorPage.Set_Sphere (m_RenderObj); - m_ScalePage.Set_Sphere (m_RenderObj); + m_GeneralPage.Set_Sphere (m_RenderObj.Peek()); + m_ColorPage.Set_Sphere (m_RenderObj.Peek()); + m_ScalePage.Set_Sphere (m_RenderObj.Peek()); // // Add the pages to the sheet @@ -270,12 +267,12 @@ SpherePropertySheetClass::Initialize () void SpherePropertySheetClass::Create_New_Object () { - m_RenderObj = new SphereRenderObjClass; + m_RenderObj = RefCountPtr::Create_NoAddRef(new SphereRenderObjClass); m_RenderObj->Set_Name ("Sphere"); // // Display the new object // - ::GetCurrentDocument ()->DisplayObject (m_RenderObj); + ::GetCurrentDocument ()->DisplayObject (m_RenderObj.Peek()); } diff --git a/Core/Tools/W3DView/SpherePropertySheet.h b/Core/Tools/W3DView/SpherePropertySheet.h index b04e35d87af..656eaea1498 100644 --- a/Core/Tools/W3DView/SpherePropertySheet.h +++ b/Core/Tools/W3DView/SpherePropertySheet.h @@ -39,6 +39,7 @@ #include "SphereColorPropPage.h" #include "SphereGeneralPropPage.h" #include "SphereSizePropPage.h" +#include "ref_ptr.h" // Forward declarations @@ -109,7 +110,7 @@ class SpherePropertySheetClass : public CPropertySheet SphereGeneralPropPageClass m_GeneralPage; SphereColorPropPageClass m_ColorPage; SphereSizePropPageClass m_ScalePage; - SphereRenderObjClass * m_RenderObj; + RefCountPtr m_RenderObj; CString m_LastSavedName; }; From e75954a9bdb1261d56e32dcaa3e8e758e2a9d007 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Mon, 29 Jun 2026 15:36:56 -0400 Subject: [PATCH 3/3] refactor(w3dview): Migrate W3DViewDoc and GraphicView to RefCountPtr --- Core/Tools/W3DView/GraphicView.cpp | 18 ++-- Core/Tools/W3DView/GraphicView.h | 9 +- Core/Tools/W3DView/W3DViewDoc.cpp | 131 ++++++++++++----------------- Core/Tools/W3DView/W3DViewDoc.h | 15 ++-- 4 files changed, 75 insertions(+), 98 deletions(-) diff --git a/Core/Tools/W3DView/GraphicView.cpp b/Core/Tools/W3DView/GraphicView.cpp index baf95806645..ebbf30e0c60 100644 --- a/Core/Tools/W3DView/GraphicView.cpp +++ b/Core/Tools/W3DView/GraphicView.cpp @@ -71,7 +71,6 @@ IMPLEMENT_DYNCREATE(CGraphicView, CView) //////////////////////////////////////////////////////////////////////////// CGraphicView::CGraphicView () : m_bInitialized (FALSE), - m_pCamera (nullptr), m_TimerID (0), m_bMouseDown (FALSE), m_bRMouseDown (FALSE), @@ -83,7 +82,6 @@ CGraphicView::CGraphicView () m_objectRotation (NoRotation), m_LightRotation (NoRotation), m_bLightMeshInScene (false), - m_pLightMesh (nullptr), m_ParticleCountUpdate (0), m_CameraBonePosX (false), m_UpdateCounter (0), @@ -212,7 +210,7 @@ CGraphicView::InitializeGraphicView () if (bReturn && (m_pCamera == nullptr)) { // Instantiate a new camera class - m_pCamera = new CameraClass (); + m_pCamera = RefCountPtr::Create_NoAddRef(new CameraClass ()); bReturn = (m_pCamera != nullptr); // Were we successful in creating a camera? @@ -230,7 +228,7 @@ CGraphicView::InitializeGraphicView () // // Attach the 'listener' to the camera // - WWAudioClass::Get_Instance ()->Get_Sound_Scene ()->Attach_Listener_To_Obj (m_pCamera); + WWAudioClass::Get_Instance ()->Get_Sound_Scene ()->Attach_Listener_To_Obj (m_pCamera.Peek()); } Reset_FOV (); @@ -240,7 +238,7 @@ CGraphicView::InitializeGraphicView () ResourceFileClass light_mesh_file (nullptr, "Light.w3d"); WW3DAssetManager::Get_Instance()->Load_3D_Assets (light_mesh_file); - m_pLightMesh = WW3DAssetManager::Get_Instance()->Create_Render_Obj ("LIGHT"); + m_pLightMesh = RefCountPtr::Create_NoAddRef(WW3DAssetManager::Get_Instance()->Create_Render_Obj ("LIGHT")); ASSERT (m_pLightMesh != nullptr); m_bLightMeshInScene = false; } @@ -323,8 +321,8 @@ CGraphicView::OnDestroy () // // Free the camera object // - REF_PTR_RELEASE (m_pCamera); - REF_PTR_RELEASE (m_pLightMesh); + m_pCamera.Clear(); + m_pLightMesh.Clear(); // Is there an update thread running? if (m_TimerID == 0) { @@ -520,7 +518,7 @@ CGraphicView::RepaintView // Wait for all previous rendering to complete before starting benchmark. DWORD profile_time = ::Get_CPU_Clock (pt_high); - WW3D::Render (doc->GetScene (), m_pCamera, FALSE, FALSE); + WW3D::Render (doc->GetScene (), m_pCamera.Peek(), FALSE, FALSE); // Wait for all rendering to complete before stopping benchmark. DWORD milliseconds = (::Get_CPU_Clock (pt_high) - profile_time) / 1000; @@ -531,7 +529,7 @@ CGraphicView::RepaintView WW3D::Render (doc->GetCursorScene (), doc->Get2DCamera (), FALSE, FALSE); // Render the dazzles - doc->Render_Dazzles(m_pCamera); + doc->Render_Dazzles(m_pCamera.Peek()); // Finish out the rendering process WW3D::End_Render (); @@ -589,7 +587,7 @@ CGraphicView::UpdateDisplay () // Render the current view inside the frame WW3D::Begin_Render (TRUE, TRUE, Vector3 (0.2,0.4,0.6)); - WW3D::Render (doc->GetScene (), m_pCamera, FALSE, FALSE); + WW3D::Render (doc->GetScene (), m_pCamera.Peek(), FALSE, FALSE); WW3D::End_Render (); } */ } diff --git a/Core/Tools/W3DView/GraphicView.h b/Core/Tools/W3DView/GraphicView.h index b63fcd0649c..4618284dff9 100644 --- a/Core/Tools/W3DView/GraphicView.h +++ b/Core/Tools/W3DView/GraphicView.h @@ -41,6 +41,7 @@ class ParticleEmitterClass; // CGraphicView view #include "camera.h" +#include "ref_ptr.h" class CGraphicView : public CView { @@ -170,7 +171,7 @@ class CGraphicView : public CView void SetAllowedCameraRotation (CAMERA_ROTATION cameraRotation); CAMERA_ROTATION GetAllowedCameraRotation () const { return m_allowedCameraRotation; } void SetCameraPos (CAMERA_POS cameraPos); - class CameraClass *GetCamera () const { return m_pCamera; } + class CameraClass *GetCamera () const { return m_pCamera.Peek(); } float Get_Camera_Distance () const { return m_CameraDistance; } void Set_Camera_Distance (float dist); @@ -200,7 +201,7 @@ class CGraphicView : public CView // // Misc // - RenderObjClass * Get_Light_Mesh () const { return m_pLightMesh; } + RenderObjClass * Get_Light_Mesh () const { return m_pLightMesh.Peek(); } Vector3 & Get_Object_Center () { return m_ObjectCenter; } // @@ -227,8 +228,8 @@ class CGraphicView : public CView BOOL m_bInitialized; BOOL m_bActive; UINT m_TimerID; - CameraClass * m_pCamera; - RenderObjClass * m_pLightMesh; + RefCountPtr m_pCamera; + RefCountPtr m_pLightMesh; bool m_bLightMeshInScene; Vector3 m_ObjectCenter; SphereClass m_ViewedSphere; diff --git a/Core/Tools/W3DView/W3DViewDoc.cpp b/Core/Tools/W3DView/W3DViewDoc.cpp index 6fa783c8dd0..65a5d36f66c 100644 --- a/Core/Tools/W3DView/W3DViewDoc.cpp +++ b/Core/Tools/W3DView/W3DViewDoc.cpp @@ -129,7 +129,6 @@ CW3DViewDoc::CW3DViewDoc () CW3DViewDoc::~CW3DViewDoc () { CleanupResources (); - REF_PTR_RELEASE (m_pCursor); } @@ -170,14 +169,14 @@ CW3DViewDoc::CleanupResources () if (m_pCursor != nullptr) { m_pCursor->Remove (); } - REF_PTR_RELEASE (m_pCursorScene); + m_pCursorScene.Clear(); if (m_pCScene) { if (m_pCRenderObj) { // Remove the currently displayed object from the scene - Remove_Object_From_Scene (m_pCRenderObj); + Remove_Object_From_Scene (m_pCRenderObj.Peek()); } if (m_pCSceneLight) @@ -198,14 +197,6 @@ CW3DViewDoc::CleanupResources () delete m_pDazzleLayer; m_pDazzleLayer = nullptr; - // Was there a valid scene object? - if (m_pCBackObjectScene) - { - // Free the scene object - m_pCBackObjectScene->Release_Ref (); - m_pCBackObjectScene = nullptr; - } - // Was there a valid 2D camera? if (m_pC2DCamera) { @@ -236,14 +227,10 @@ CW3DViewDoc::CleanupResources () m_pCSceneLight = nullptr; } - // Was there a valid display object? - if (m_pCRenderObj) - { - // Free the currently displayed object - SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); - REF_PTR_RELEASE (m_pCRenderObj); - } + // Free the currently displayed object + SAFE_DELETE (m_pCAnimCombo); + m_pCAnimation.Clear (); + m_pCRenderObj.Clear (); } /////////////////////////////////////////////////////////////// @@ -264,7 +251,7 @@ CW3DViewDoc::OnNewDocument () if (m_pCScene && m_pCRenderObj) { // Remove the currently displayed object from the scene - Remove_Object_From_Scene (m_pCRenderObj); + Remove_Object_From_Scene (m_pCRenderObj.Peek()); } if (m_pCScene) @@ -276,13 +263,10 @@ CW3DViewDoc::OnNewDocument () m_pCScene->Set_Fog_Color(m_backgroundColor); } - if (m_pCRenderObj) - { - // Free the currently displayed object - SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); - REF_PTR_RELEASE (m_pCRenderObj); - } + // Free the currently displayed object + SAFE_DELETE (m_pCAnimCombo); + m_pCAnimation.Clear(); + m_pCRenderObj.Clear(); CDataTreeView *pCDataTreeView = GetDataTreeView (); if (pCDataTreeView) @@ -390,11 +374,11 @@ CW3DViewDoc::InitScene () ASSERT (m_pC2DScene); // Instantiate a new 2D cursor scene - m_pCursorScene = new SimpleSceneClass; - ASSERT (m_pCursorScene); + m_pCursorScene = RefCountPtr::Create_NoAddRef(new SimpleSceneClass); + ASSERT (m_pCursorScene.Peek()); Create_Cursor (); - m_pCursorScene->Add_Render_Object (m_pCursor); + m_pCursorScene->Add_Render_Object (m_pCursor.Peek()); m_pCBackObjectScene = new SimpleSceneClass; @@ -600,24 +584,22 @@ CW3DViewDoc::Display_Emitter // Lose the animation SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); - - if (m_pCRenderObj != nullptr) { + m_pCAnimation.Clear(); - // Remove this object from the scene - Remove_Object_From_Scene (m_pCRenderObj); - m_pCRenderObj->Release_Ref (); - m_pCRenderObj = nullptr; - } - m_pCScene->Clear_Lineup(); + if (m_pCRenderObj != nullptr) { + // Remove this object from the scene + Remove_Object_From_Scene (m_pCRenderObj.Peek()); + m_pCRenderObj.Clear(); + } + m_pCScene->Clear_Lineup(); // Do we have a new emitter to display? if (pemitter != nullptr) { // Add the emitter to the scene pemitter->Set_Transform (Matrix3D (1)); - REF_PTR_SET (m_pCRenderObj, pemitter); - m_pCScene->Add_Render_Object (m_pCRenderObj); + m_pCRenderObj = RefCountPtr::Create_AddRef(pemitter); + m_pCScene->Add_Render_Object (m_pCRenderObj.Peek()); pemitter->Start (); CGraphicView *pCGraphicView = GetGraphicView (); @@ -656,17 +638,15 @@ CW3DViewDoc::DisplayObject if (m_pCScene) { // Lose the animation - SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); + SAFE_DELETE (m_pCAnimCombo); + m_pCAnimation.Clear(); // Do we have an old object to remove from the scene? if (add_ghost == false) { - if (m_pCRenderObj) - { + if (m_pCRenderObj) { // Remove this object from the scene - Remove_Object_From_Scene (m_pCRenderObj); - m_pCRenderObj->Release_Ref (); - m_pCRenderObj = nullptr; + Remove_Object_From_Scene (m_pCRenderObj.Peek()); + m_pCRenderObj.Clear(); } } m_pCScene->Clear_Lineup(); @@ -677,21 +657,20 @@ CW3DViewDoc::DisplayObject // Reset the animation for this object pCModel->Set_Animation (); - m_pCRenderObj = pCModel; - m_pCRenderObj->Add_Ref (); + m_pCRenderObj = RefCountPtr::Create_AddRef(pCModel); m_pCRenderObj->Set_Transform (Matrix3D (1)); // Add this object to the scene if (m_pCRenderObj->Class_ID () == RenderObjClass::CLASSID_BITMAP2D) { - m_pC2DScene->Add_Render_Object (m_pCRenderObj); + m_pC2DScene->Add_Render_Object (m_pCRenderObj.Peek()); } else { - m_pCScene->Add_Render_Object (m_pCRenderObj); + m_pCScene->Add_Render_Object (m_pCRenderObj.Peek()); } // Reset the current lod to be the lowest possible LOD... if ((m_pCScene->Are_LODs_Switching ()) && (m_pCRenderObj->Class_ID () == RenderObjClass::CLASSID_HLOD)) { - ((HLodClass *)m_pCRenderObj)->Set_LOD_Level (0); + ((HLodClass *)m_pCRenderObj.Peek())->Set_LOD_Level (0); } CGraphicView *pCGraphicView = GetGraphicView (); @@ -756,7 +735,7 @@ CW3DViewDoc::DisplayObject void CW3DViewDoc::ResetAnimation () { - if (m_pCAnimation != nullptr) { + if (m_pCAnimation) { // // Reset the frame counter @@ -820,7 +799,7 @@ CW3DViewDoc::StepAnimation (int iFrameInc) m_pCRenderObj->Set_Animation (m_pCAnimCombo); } else { - m_pCRenderObj->Set_Animation (m_pCAnimation, m_CurrentFrame); + m_pCRenderObj->Set_Animation (m_pCAnimation.Peek(), m_CurrentFrame); } Update_Camera (); @@ -855,10 +834,9 @@ CW3DViewDoc::PlayAnimation DisplayObject (pCModel); // Get an instance of the animation object - SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); - m_pCAnimation = WW3DAssetManager::Get_Instance()->Get_HAnim (pszAnimationName); - ASSERT (m_pCAnimation); + SAFE_DELETE (m_pCAnimCombo); + m_pCAnimation = RefCountPtr::Create_NoAddRef(WW3DAssetManager::Get_Instance()->Get_HAnim (pszAnimationName)); + ASSERT (m_pCAnimation.Peek()); // Reset the frame counter m_CurrentFrame = 0; @@ -867,7 +845,7 @@ CW3DViewDoc::PlayAnimation if (m_pCRenderObj) { // Update the animation frame - m_pCRenderObj->Set_Animation (m_pCAnimation, 0); + m_pCRenderObj->Set_Animation (m_pCAnimation.Peek(), 0); CGraphicView *pCGraphicView = GetGraphicView (); if (pCGraphicView) @@ -899,7 +877,7 @@ CW3DViewDoc::PlayAnimation void CW3DViewDoc::Play_Animation_Sound () { - if (m_pCAnimation != nullptr) { + if (m_pCAnimation) { CString animation_name = m_pCAnimation->Get_Name (); // @@ -943,11 +921,10 @@ CW3DViewDoc::PlayAnimation DisplayObject (pCModel); // Get an instance of the animation object - SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); - m_pCAnimCombo = pCAnimCombo; - m_pCAnimation = m_pCAnimCombo->Get_Motion(0); // ref added by get_motion - ASSERT (m_pCAnimation); + SAFE_DELETE (m_pCAnimCombo); + m_pCAnimCombo = pCAnimCombo; + m_pCAnimation = RefCountPtr::Create_NoAddRef(m_pCAnimCombo->Get_Motion(0)); // ref added by get_motion + ASSERT (m_pCAnimation.Peek()); // It will be assumed that every animation in the m_pCAnimCombo // has the same number of frames and has the same framerate as @@ -1030,7 +1007,7 @@ CW3DViewDoc::Update_Camera () if (m_bAnimateCamera && m_pCRenderObj != nullptr) { Matrix3D transform (1); - if (Get_Camera_Transform (m_pCRenderObj, transform)) { + if (Get_Camera_Transform (m_pCRenderObj.Peek(), transform)) { // Convert the bone's transform into a camera transform //Matrix3D transform = m_pCRenderObj->Get_Bone_Transform (index); @@ -1092,9 +1069,9 @@ CW3DViewDoc::UpdateFrame (float relativeTimeSlice) m_pCRenderObj->Set_Animation (m_pCAnimCombo); } else if (m_bAnimBlend) { - m_pCRenderObj->Set_Animation (m_pCAnimation, m_CurrentFrame); + m_pCRenderObj->Set_Animation (m_pCAnimation.Peek(), m_CurrentFrame); } else { - m_pCRenderObj->Set_Animation (m_pCAnimation, (int)m_CurrentFrame); + m_pCRenderObj->Set_Animation (m_pCAnimation.Peek(), (int)m_CurrentFrame); } Update_Camera (); @@ -1847,7 +1824,7 @@ CW3DViewDoc::Remove_Object_From_Scene (RenderObjClass *prender_obj) { // If the render object is null, then remove the current render object if (prender_obj == nullptr) { - prender_obj = m_pCRenderObj; + prender_obj = m_pCRenderObj.Peek(); } // Recursively remove objects from the scene (to make sure we get all particle buffers) @@ -2403,7 +2380,7 @@ CW3DViewDoc::Make_Movie () m_pCRenderObj->Set_Animation (m_pCAnimCombo); } else - m_pCRenderObj->Set_Animation (m_pCAnimation, (int)0); + m_pCRenderObj->Set_Animation (m_pCAnimation.Peek(), (int)0); graphic_view->RepaintView (FALSE); // Begin our movie @@ -2425,7 +2402,7 @@ CW3DViewDoc::Make_Movie () m_pCRenderObj->Set_Animation (m_pCAnimCombo); } else - m_pCRenderObj->Set_Animation (m_pCAnimation, frame); + m_pCRenderObj->Set_Animation (m_pCAnimation.Peek(), frame); // Should we be updating the camera? if (m_bAnimateCamera) { @@ -2483,7 +2460,7 @@ CW3DViewDoc::Build_Emitter_List // If the render object is null, then start from the current render object // if (render_obj == nullptr) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } // @@ -2558,7 +2535,7 @@ void CW3DViewDoc::Create_Cursor () { if (m_pCursor == nullptr) { - m_pCursor = new ScreenCursorClass; + m_pCursor = RefCountPtr::Create_NoAddRef(new ScreenCursorClass); m_pCursor->Set_Window (GetGraphicView ()->m_hWnd); m_pCursor->Set_Texture (::Load_RC_Texture ("cursor.tga")); } @@ -2579,7 +2556,7 @@ CW3DViewDoc::Count_Particles (RenderObjClass *render_obj) // If the render object is null, then start from the current render object // if (render_obj == nullptr) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } // @@ -2638,7 +2615,7 @@ CW3DViewDoc::Switch_LOD (int increment, RenderObjClass *render_obj) // If the render object is null, then start from the current render object // if (render_obj == nullptr) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } // @@ -2676,7 +2653,7 @@ CW3DViewDoc::Toggle_Alternate_Materials(RenderObjClass * render_obj) // If the render object is null, start from the current render object // if (render_obj == nullptr) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } if (render_obj != nullptr) { diff --git a/Core/Tools/W3DView/W3DViewDoc.h b/Core/Tools/W3DView/W3DViewDoc.h index e58bc3d5700..108a5a9ea61 100644 --- a/Core/Tools/W3DView/W3DViewDoc.h +++ b/Core/Tools/W3DView/W3DViewDoc.h @@ -29,6 +29,7 @@ #include "dynamesh.h" #include "rendobj.h" #include "LODDefs.h" +#include "ref_ptr.h" /////////////////////////////////////////////////////////// @@ -112,12 +113,12 @@ class CW3DViewDoc : public CDocument CameraClass * Get2DCamera () const { return m_pC2DCamera; } CameraClass * GetBackObjectCamera () const { return m_pCBackObjectCamera; } SceneClass * Get2DScene () const { return m_pC2DScene; } - SceneClass * GetCursorScene () const { return m_pCursorScene; } + SceneClass * GetCursorScene () const { return m_pCursorScene.Peek(); } ViewerSceneClass * GetScene () const { return m_pCScene; } SceneClass * GetBackObjectScene () const { return m_pCBackObjectScene; } LightClass * GetSceneLight () const { return m_pCSceneLight; } - RenderObjClass * GetDisplayedObject () const { return m_pCRenderObj; } - HAnimClass * GetCurrentAnimation () const { return m_pCAnimation; } + RenderObjClass * GetDisplayedObject () const { return m_pCRenderObj.Peek(); } + HAnimClass * GetCurrentAnimation () const { return m_pCAnimation.Peek(); } const HTreeClass * Get_Current_HTree () const; // @@ -291,18 +292,18 @@ class CW3DViewDoc : public CDocument ////////////////////////////////////////////////////////////////// ViewerSceneClass * m_pCScene; SceneClass * m_pC2DScene; - SceneClass * m_pCursorScene; + RefCountPtr m_pCursorScene; SceneClass * m_pCBackObjectScene; DazzleLayerClass * m_pDazzleLayer; - RenderObjClass * m_pCRenderObj; + RefCountPtr m_pCRenderObj; RenderObjClass * m_pCBackgroundObject; - HAnimClass * m_pCAnimation; + RefCountPtr m_pCAnimation; HAnimComboClass * m_pCAnimCombo; LightClass * m_pCSceneLight; Bitmap2DObjClass * m_pCBackgroundBMP; CameraClass * m_pC2DCamera; CameraClass * m_pCBackObjectCamera; - ScreenCursorClass * m_pCursor; + RefCountPtr m_pCursor; Vector3 m_backgroundColor; CString m_stringBackgroundBMP; CString m_stringBackgroundObject;