diff --git a/Core/Tools/W3DView/AssetInfo.cpp b/Core/Tools/W3DView/AssetInfo.cpp index 6a712d8402e..a2a73948999 100644 --- a/Core/Tools/W3DView/AssetInfo.cpp +++ b/Core/Tools/W3DView/AssetInfo.cpp @@ -52,28 +52,23 @@ AssetInfoClass::Initialize () if (m_AssetType != TypeMaterial) { // Assume we are wrapping an instance as apposed to an asset 'name'. - RenderObjClass *prender_obj = m_pRenderObj; - if (prender_obj) - prender_obj->Add_Ref(); + RefCountPtr render_obj = m_pRenderObj; // If we are wrapping an asset name, then create an instance of it. - if (prender_obj == nullptr) { - prender_obj = WW3DAssetManager::Get_Instance()->Create_Render_Obj (m_Name); + if (render_obj == nullptr) { + render_obj.Assign_No_Add_Ref (WW3DAssetManager::Get_Instance()->Create_Render_Obj (m_Name)); } - if (prender_obj != nullptr) { + if (render_obj != nullptr) { // Get the hierarchy tree for this object (if one exists) - const HTreeClass *phtree = prender_obj->Get_HTree (); + const HTreeClass *phtree = render_obj->Get_HTree (); if (phtree) { // Get the name of the hierarchy tree m_HierarchyName = phtree->Get_Name (); } } - - // Release our hold on the temporary object - REF_PTR_RELEASE (prender_obj); } } diff --git a/Core/Tools/W3DView/AssetInfo.h b/Core/Tools/W3DView/AssetInfo.h index 73875689798..cc6da52e35e 100644 --- a/Core/Tools/W3DView/AssetInfo.h +++ b/Core/Tools/W3DView/AssetInfo.h @@ -37,7 +37,6 @@ #pragma once #include "WW3D2/rendobj.h" -#include "Utils.h" #include "AssetTypes.h" @@ -58,16 +57,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 (Create_Add_Ref (prender_obj)) { Initialize (); } - virtual ~AssetInfoClass () { REF_PTR_RELEASE (m_pRenderObj); } + virtual ~AssetInfoClass () {} ////////////////////////////////////////////////////////////// // @@ -83,14 +81,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.Assign_Add_Ref (pobj); } // // Information methods @@ -118,5 +116,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/GraphicView.cpp b/Core/Tools/W3DView/GraphicView.cpp index d2fcaa341cf..a15dd58cbbe 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.Assign_No_Add_Ref (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.Assign_No_Add_Ref (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 43c891df881..7175327089c 100644 --- a/Core/Tools/W3DView/GraphicView.h +++ b/Core/Tools/W3DView/GraphicView.h @@ -170,7 +170,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 +200,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 +227,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/PlaySoundDialog.cpp b/Core/Tools/W3DView/PlaySoundDialog.cpp index 06b6f2c441e..ef3d5544f7f 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.Assign_No_Add_Ref (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 31472f71e2a..1162955df3b 100644 --- a/Core/Tools/W3DView/PlaySoundDialog.h +++ b/Core/Tools/W3DView/PlaySoundDialog.h @@ -61,7 +61,7 @@ class PlaySoundDialogClass : public CDialog private: CString Filename; - AudibleSoundClass * SoundObj; + RefCountPtr SoundObj; }; //{{AFX_INSERT_LOCATION}} diff --git a/Core/Tools/W3DView/RingPropertySheet.cpp b/Core/Tools/W3DView/RingPropertySheet.cpp index 891814b89e1..6df83a97df4 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 (Create_Add_Ref (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 (Create_Add_Ref (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.Assign_Add_Ref ((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.Assign_No_Add_Ref (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..4e101da0baf 100644 --- a/Core/Tools/W3DView/RingPropertySheet.h +++ b/Core/Tools/W3DView/RingPropertySheet.h @@ -109,7 +109,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/ScreenCursor.cpp b/Core/Tools/W3DView/ScreenCursor.cpp index 25d97e94d6c..8c358221e59 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.Assign_No_Add_Ref (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.Assign_Add_Ref (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 937cd462e1e..19f65a6f904 100644 --- a/Core/Tools/W3DView/ScreenCursor.h +++ b/Core/Tools/W3DView/ScreenCursor.h @@ -93,8 +93,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]; diff --git a/Core/Tools/W3DView/SpherePropertySheet.cpp b/Core/Tools/W3DView/SpherePropertySheet.cpp index 656b994fed4..07f05bcaa01 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 (Create_Add_Ref (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 (Create_Add_Ref (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.Assign_Add_Ref ((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.Assign_No_Add_Ref (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..2589687b2a3 100644 --- a/Core/Tools/W3DView/SpherePropertySheet.h +++ b/Core/Tools/W3DView/SpherePropertySheet.h @@ -109,7 +109,7 @@ class SpherePropertySheetClass : public CPropertySheet SphereGeneralPropPageClass m_GeneralPage; SphereColorPropPageClass m_ColorPage; SphereSizePropPageClass m_ScalePage; - SphereRenderObjClass * m_RenderObj; + RefCountPtr m_RenderObj; CString m_LastSavedName; }; diff --git a/Core/Tools/W3DView/W3DViewDoc.cpp b/Core/Tools/W3DView/W3DViewDoc.cpp index 4cdb0d23a5a..25213270260 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); } @@ -141,109 +140,66 @@ CW3DViewDoc::~CW3DViewDoc () void CW3DViewDoc::CleanupResources () { - if (m_pC2DScene) + if (m_pCBackgroundBMP) { - if (m_pCBackgroundBMP) - { - // Remove the background BMP from the scene - m_pCBackgroundBMP->Remove (); - } - - // Release the 2D scene we allocated to display background BMPs - m_pC2DScene->Release_Ref (); - m_pC2DScene = nullptr; + // Remove the background BMP from the scene + m_pCBackgroundBMP->Remove (); } - if (m_pCBackObjectScene) - { - if (m_pCBackgroundObject) - { - // Remove the background BMP from the scene - m_pCBackgroundObject->Remove (); - } + // Release the 2D scene we allocated to display background BMPs + m_pC2DScene.Clear (); - // Release the scene we allocated to display background objects - m_pCBackObjectScene->Release_Ref (); - m_pCBackObjectScene = nullptr; + if (m_pCBackgroundObject) + { + // Remove the background BMP from the scene + m_pCBackgroundObject->Remove (); } + // Release the scene we allocated to display background objects + m_pCBackObjectScene.Clear (); + 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) { // Remove the light from the scene - Remove_Object_From_Scene (m_pCSceneLight); + Remove_Object_From_Scene (m_pCSceneLight.Peek()); } // Get rid of the lined up objects. m_pCScene->Clear_Lineup(); // Release the scene object we allocated earlier - m_pCScene->Release_Ref (); - m_pCScene = nullptr; + m_pCScene.Clear (); } // Was there a dazzle layer? 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) - { - // Free the camera object - m_pC2DCamera->Release_Ref (); - m_pC2DCamera = nullptr; - } - - // Was there a valid background camera? - if (m_pCBackObjectCamera) - { - // Free the camera object - m_pCBackObjectCamera->Release_Ref (); - m_pCBackObjectCamera = nullptr; - } - - // Was there a valid background BMP? - if (m_pCBackgroundBMP) - { - m_pCBackgroundBMP->Release_Ref (); - m_pCBackgroundBMP = nullptr; - } + // Free the camera objects + m_pC2DCamera.Clear (); + m_pCBackObjectCamera.Clear (); - // Was there a valid scene light? - if (m_pCSceneLight) - { - m_pCSceneLight->Release_Ref (); - m_pCSceneLight = nullptr; - } + // Free the background BMP and scene light + m_pCBackgroundBMP.Clear (); + m_pCSceneLight.Clear (); - // 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 +220,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 +232,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) @@ -354,7 +307,7 @@ CW3DViewDoc::InitScene () // ParticleEmitterClass::Set_Default_Remove_On_Complete (false); - m_pCScene = new ViewerSceneClass; + m_pCScene.Assign_No_Add_Ref (new ViewerSceneClass); ASSERT (m_pCScene); if (m_pCScene != nullptr) { @@ -365,7 +318,7 @@ CW3DViewDoc::InitScene () m_pCScene->Set_Fog_Color(GetBackgroundColor()); // Create a new scene light - m_pCSceneLight = new LightClass; + m_pCSceneLight.Assign_No_Add_Ref (new LightClass); ASSERT (m_pCSceneLight); if (m_pCSceneLight != nullptr) { @@ -381,23 +334,23 @@ CW3DViewDoc::InitScene () m_pCSceneLight->Set_Specular (Vector3(1, 1, 1)); // Add this light to the scene - m_pCScene->Add_Render_Object (m_pCSceneLight); + m_pCScene->Add_Render_Object (m_pCSceneLight.Peek()); } } // Instantiate a new 2D scene - m_pC2DScene = new SimpleSceneClass; + m_pC2DScene.Assign_No_Add_Ref (new SimpleSceneClass); ASSERT (m_pC2DScene); // Instantiate a new 2D cursor scene - m_pCursorScene = new SimpleSceneClass; - ASSERT (m_pCursorScene); + m_pCursorScene.Assign_No_Add_Ref (new SimpleSceneClass); + ASSERT (m_pCursorScene != nullptr); Create_Cursor (); - m_pCursorScene->Add_Render_Object (m_pCursor); + m_pCursorScene->Add_Render_Object (m_pCursor.Peek()); - m_pCBackObjectScene = new SimpleSceneClass; + m_pCBackObjectScene.Assign_No_Add_Ref (new SimpleSceneClass); // Were we successful in instantiating the scene object? ASSERT (m_pCBackObjectScene); @@ -410,7 +363,7 @@ CW3DViewDoc::InitScene () // Create a new instance of the camera class to use // when rendering the background object - m_pCBackObjectCamera = new CameraClass (); + m_pCBackObjectCamera.Assign_No_Add_Ref (new CameraClass ()); // Were we successful in creating the new instance? ASSERT (m_pCBackObjectCamera); @@ -424,7 +377,7 @@ CW3DViewDoc::InitScene () // Create a new instance of the camera class to use // when rendering the background BMP - m_pC2DCamera = new CameraClass (); + m_pC2DCamera.Assign_No_Add_Ref (new CameraClass ()); // Were we successful in creating the new instance? ASSERT (m_pC2DCamera); @@ -600,14 +553,13 @@ CW3DViewDoc::Display_Emitter // Lose the animation SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); + m_pCAnimation.Clear(); if (m_pCRenderObj != nullptr) { // 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(); @@ -616,8 +568,8 @@ CW3DViewDoc::Display_Emitter // 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.Assign_Add_Ref (pemitter); + m_pCScene->Add_Render_Object (m_pCRenderObj.Peek()); pemitter->Start (); CGraphicView *pCGraphicView = GetGraphicView (); @@ -657,16 +609,15 @@ CW3DViewDoc::DisplayObject { // Lose the animation SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); + m_pCAnimation.Clear(); // Do we have an old object to remove from the scene? if (add_ghost == false) { 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 +628,20 @@ CW3DViewDoc::DisplayObject // Reset the animation for this object pCModel->Set_Animation (); - m_pCRenderObj = pCModel; - m_pCRenderObj->Add_Ref (); + m_pCRenderObj.Assign_Add_Ref (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 (); @@ -820,7 +770,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 (); @@ -856,9 +806,8 @@ CW3DViewDoc::PlayAnimation // 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); + m_pCAnimation.Assign_No_Add_Ref (WW3DAssetManager::Get_Instance()->Get_HAnim (pszAnimationName)); + ASSERT (m_pCAnimation != nullptr); // Reset the frame counter m_CurrentFrame = 0; @@ -867,7 +816,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) @@ -944,10 +893,9 @@ CW3DViewDoc::PlayAnimation // 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); + m_pCAnimation.Assign_No_Add_Ref (m_pCAnimCombo->Get_Motion(0)); // ref added by get_motion + ASSERT (m_pCAnimation != nullptr); // 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 +978,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 +1040,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 (); @@ -1256,8 +1204,7 @@ CW3DViewDoc::SetBackgroundBMP (LPCTSTR pszBackgroundBMP) // Remove the background BMP from the scene // and release its pointer m_pCBackgroundBMP->Remove (); - m_pCBackgroundBMP->Release_Ref (); - m_pCBackgroundBMP = nullptr; + m_pCBackgroundBMP.Clear (); } // Is this a new background BMP? @@ -1265,14 +1212,14 @@ CW3DViewDoc::SetBackgroundBMP (LPCTSTR pszBackgroundBMP) (m_stringBackgroundBMP.CompareNoCase (pszBackgroundBMP) != 0)) { // Create a new instance of the BMP object to use - m_pCBackgroundBMP = new Bitmap2DObjClass (pszBackgroundBMP, 0.5F, 0.5F, TRUE, FALSE); + m_pCBackgroundBMP.Assign_No_Add_Ref (new Bitmap2DObjClass (pszBackgroundBMP, 0.5F, 0.5F, TRUE, FALSE)); // Were we successful in creating the bitmap object? ASSERT (m_pCBackgroundBMP); if (m_pCBackgroundBMP) { // Add the object to the scene - m_pC2DScene->Add_Render_Object (m_pCBackgroundBMP); + m_pC2DScene->Add_Render_Object (m_pCBackgroundBMP.Peek()); } } @@ -1796,14 +1743,13 @@ CW3DViewDoc::SetBackgroundObject (LPCTSTR pszBackgroundObjectName) m_pCBackgroundObject->Remove (); // Free the object - m_pCBackgroundObject->Release_Ref (); - m_pCBackgroundObject = nullptr; + m_pCBackgroundObject.Clear (); } if (pszBackgroundObjectName) { // Create a new instance of the render object to use as the background - m_pCBackgroundObject = WW3DAssetManager::Get_Instance()->Create_Render_Obj (pszBackgroundObjectName); + m_pCBackgroundObject.Assign_No_Add_Ref (WW3DAssetManager::Get_Instance()->Create_Render_Obj (pszBackgroundObjectName)); ASSERT (m_pCBackgroundObject); if (m_pCBackgroundObject) @@ -1827,7 +1773,7 @@ CW3DViewDoc::SetBackgroundObject (LPCTSTR pszBackgroundObjectName) m_pCBackObjectCamera->Set_Clip_Planes (1, cameraDepth); // Add the background object to the scene - m_pCBackObjectScene->Add_Render_Object (m_pCBackgroundObject); + m_pCBackObjectScene->Add_Render_Object (m_pCBackgroundObject.Peek()); } } @@ -1847,7 +1793,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 +2349,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 +2371,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 +2429,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 +2504,7 @@ void CW3DViewDoc::Create_Cursor () { if (m_pCursor == nullptr) { - m_pCursor = new ScreenCursorClass; + m_pCursor.Assign_No_Add_Ref (new ScreenCursorClass); m_pCursor->Set_Window (GetGraphicView ()->m_hWnd); m_pCursor->Set_Texture (::Load_RC_Texture ("cursor.tga")); } @@ -2579,7 +2525,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 +2584,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 +2622,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 b92076e1a05..768af4f6480 100644 --- a/Core/Tools/W3DView/W3DViewDoc.h +++ b/Core/Tools/W3DView/W3DViewDoc.h @@ -109,15 +109,15 @@ class CW3DViewDoc : public CDocument // // Accessors // - CameraClass * Get2DCamera () const { return m_pC2DCamera; } - CameraClass * GetBackObjectCamera () const { return m_pCBackObjectCamera; } - SceneClass * Get2DScene () const { return m_pC2DScene; } - SceneClass * GetCursorScene () const { return m_pCursorScene; } - 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; } + CameraClass * Get2DCamera () const { return m_pC2DCamera.Peek(); } + CameraClass * GetBackObjectCamera () const { return m_pCBackObjectCamera.Peek(); } + SceneClass * Get2DScene () const { return m_pC2DScene.Peek(); } + SceneClass * GetCursorScene () const { return m_pCursorScene.Peek(); } + ViewerSceneClass * GetScene () const { return m_pCScene.Peek(); } + SceneClass * GetBackObjectScene () const { return m_pCBackObjectScene.Peek(); } + LightClass * GetSceneLight () const { return m_pCSceneLight.Peek(); } + RenderObjClass * GetDisplayedObject () const { return m_pCRenderObj.Peek(); } + HAnimClass * GetCurrentAnimation () const { return m_pCAnimation.Peek(); } const HTreeClass * Get_Current_HTree () const; // @@ -289,20 +289,20 @@ class CW3DViewDoc : public CDocument ////////////////////////////////////////////////////////////////// // Private member data ////////////////////////////////////////////////////////////////// - ViewerSceneClass * m_pCScene; - SceneClass * m_pC2DScene; - SceneClass * m_pCursorScene; - SceneClass * m_pCBackObjectScene; + RefCountPtr m_pCScene; + RefCountPtr m_pC2DScene; + RefCountPtr m_pCursorScene; + RefCountPtr m_pCBackObjectScene; DazzleLayerClass * m_pDazzleLayer; - RenderObjClass * m_pCRenderObj; - RenderObjClass * m_pCBackgroundObject; - HAnimClass * m_pCAnimation; + RefCountPtr m_pCRenderObj; + RefCountPtr m_pCBackgroundObject; + RefCountPtr m_pCAnimation; HAnimComboClass * m_pCAnimCombo; - LightClass * m_pCSceneLight; - Bitmap2DObjClass * m_pCBackgroundBMP; - CameraClass * m_pC2DCamera; - CameraClass * m_pCBackObjectCamera; - ScreenCursorClass * m_pCursor; + RefCountPtr m_pCSceneLight; + RefCountPtr m_pCBackgroundBMP; + RefCountPtr m_pC2DCamera; + RefCountPtr m_pCBackObjectCamera; + RefCountPtr m_pCursor; Vector3 m_backgroundColor; CString m_stringBackgroundBMP; CString m_stringBackgroundObject;