diff --git a/Core/Tools/W3DView/AssetInfo.cpp b/Core/Tools/W3DView/AssetInfo.cpp index 3b7092dcc6..513792981b 100644 --- a/Core/Tools/W3DView/AssetInfo.cpp +++ b/Core/Tools/W3DView/AssetInfo.cpp @@ -52,9 +52,8 @@ AssetInfoClass::Initialize (void) 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(); + RenderObjClass *prender_obj = m_pRenderObj.Peek(); + if (prender_obj) prender_obj->Add_Ref(); // If we are wrapping an asset name, then create an instance of it. if (prender_obj == NULL) { diff --git a/Core/Tools/W3DView/AssetInfo.h b/Core/Tools/W3DView/AssetInfo.h index 1ba0adf5e0..3132a108b1 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 (void) : m_AssetType (TypeUnknown), - m_dwUserData (0L), - m_pRenderObj (NULL) { Initialize (); } + m_dwUserData (0L) { Initialize (); } - AssetInfoClass (LPCTSTR passet_name, ASSET_TYPE type, RenderObjClass *prender_obj = NULL, DWORD user_data = 0L) - : m_Name (passet_name), - m_AssetType (type), - m_dwUserData (user_data), - m_pRenderObj (NULL) { REF_PTR_SET (m_pRenderObj, prender_obj); Initialize (); } + AssetInfoClass (LPCTSTR passet_name, ASSET_TYPE type, RenderObjClass *prender_obj = NULL, DWORD user_data = 0L) + : m_Name (passet_name), + m_AssetType (type), + m_dwUserData (user_data), + m_pRenderObj (RefCountPtr::Create_AddRef(prender_obj)) { Initialize (); } - virtual ~AssetInfoClass (void) { REF_PTR_RELEASE (m_pRenderObj); } + virtual ~AssetInfoClass (void) {} ////////////////////////////////////////////////////////////// // @@ -81,16 +80,16 @@ class AssetInfoClass const CString & Get_Hierarchy_Name (void) const { return m_HierarchyName; } const CString & Get_Original_Name (void) const { return m_OriginalName; } ASSET_TYPE Get_Type (void) const { return m_AssetType; } - DWORD Get_User_Number (void) const { return m_dwUserData; } - const CString & Get_User_String (void) const { return m_UserString; } - RenderObjClass * Get_Render_Obj (void) const { if (m_pRenderObj) m_pRenderObj->Add_Ref(); return m_pRenderObj; } - RenderObjClass * Peek_Render_Obj (void) const { return m_pRenderObj; } + DWORD Get_User_Number (void) const { return m_dwUserData; } + const CString & Get_User_String (void) const { return m_UserString; } + RenderObjClass * Get_Render_Obj (void) const { RenderObjClass *ptr = m_pRenderObj.Peek(); if (ptr) ptr->Add_Ref(); return ptr; } + RenderObjClass * Peek_Render_Obj (void) 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_User_Number (DWORD user_data) { m_dwUserData = user_data; } + void Set_User_String (LPCTSTR string) { m_UserString = string; } + 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/EmitterInstanceList.cpp b/Core/Tools/W3DView/EmitterInstanceList.cpp index a4f66a0e97..f5fd1d1957 100644 --- a/Core/Tools/W3DView/EmitterInstanceList.cpp +++ b/Core/Tools/W3DView/EmitterInstanceList.cpp @@ -33,6 +33,7 @@ #include "StdAfx.h" #include "EmitterInstanceList.h" +#include "refcount.h" #include "Utils.h" ///////////////////////////////////////////////////////////////////// @@ -90,12 +91,11 @@ EmitterInstanceListClass::Add_Emitter (ParticleEmitterClass *emitter) } } - // - // Add this emitter to the list and put a hold on its reference - // - if (emitter) - emitter->Add_Ref(); - m_List.Add (emitter); + // + // Add this emitter to the list and put a hold on its reference + // + if (emitter) emitter->Add_Ref(); + m_List.Add (emitter); } return ; diff --git a/Core/Tools/W3DView/GraphicView.cpp b/Core/Tools/W3DView/GraphicView.cpp index e32acee128..a3bf5af8dc 100644 --- a/Core/Tools/W3DView/GraphicView.cpp +++ b/Core/Tools/W3DView/GraphicView.cpp @@ -71,7 +71,6 @@ IMPLEMENT_DYNCREATE(CGraphicView, CView) //////////////////////////////////////////////////////////////////////////// CGraphicView::CGraphicView (void) : m_bInitialized (FALSE), - m_pCamera (NULL), m_TimerID (0), m_bMouseDown (FALSE), m_bRMouseDown (FALSE), @@ -83,7 +82,6 @@ CGraphicView::CGraphicView (void) m_objectRotation (NoRotation), m_LightRotation (NoRotation), m_bLightMeshInScene (false), - m_pLightMesh (NULL), m_ParticleCountUpdate (0), m_CameraBonePosX (false), m_UpdateCounter (0), @@ -216,7 +214,7 @@ CGraphicView::InitializeGraphicView (void) if (bReturn && (m_pCamera == NULL)) { // Instantiate a new camera class - m_pCamera = new CameraClass (); + m_pCamera = RefCountPtr::Create_NoAddRef(new CameraClass ()); bReturn = (m_pCamera != NULL); // Were we successful in creating a camera? @@ -234,7 +232,7 @@ CGraphicView::InitializeGraphicView (void) // // 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 (); @@ -244,7 +242,7 @@ CGraphicView::InitializeGraphicView (void) ResourceFileClass light_mesh_file (NULL, "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 != NULL); m_bLightMeshInScene = false; } @@ -329,8 +327,6 @@ CGraphicView::OnDestroy (void) // // Free the camera object // - REF_PTR_RELEASE (m_pCamera); - REF_PTR_RELEASE (m_pLightMesh); // Is there an update thread running? if (m_TimerID == 0) { @@ -533,7 +529,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; @@ -544,7 +540,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 (); @@ -603,7 +599,7 @@ CGraphicView::UpdateDisplay (void) // 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 8a6faa8b5d..42632045ae 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 (void) const { return m_pCamera; } + class CameraClass *GetCamera (void) const { return m_pCamera.Peek(); } float Get_Camera_Distance (void) const { return m_CameraDistance; } void Set_Camera_Distance (float dist); @@ -200,7 +201,7 @@ class CGraphicView : public CView // // Misc // - RenderObjClass * Get_Light_Mesh (void) const { return m_pLightMesh; } + RenderObjClass * Get_Light_Mesh (void) const { return m_pLightMesh.Peek(); } Vector3 & Get_Object_Center (void) { 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/PlaySoundDialog.cpp b/Core/Tools/W3DView/PlaySoundDialog.cpp index a15b28e23a..ad88c95201 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 /*=NULL*/) : Filename (filename), - SoundObj (NULL), CDialog(PlaySoundDialogClass::IDD, pParent) { //{{AFX_DATA_INIT(PlaySoundDialogClass) @@ -100,7 +99,6 @@ void PlaySoundDialogClass::OnCancel (void) { SoundObj->Stop (); - REF_PTR_RELEASE (SoundObj); CDialog::OnCancel (); return ; @@ -125,7 +123,7 @@ PlaySoundDialogClass::OnInitDialog (void) // // 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 == NULL) { 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 eed77d841b..2fb8151f43 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/RingPropertySheet.cpp b/Core/Tools/W3DView/RingPropertySheet.cpp index 51ca2e8a78..9469823673 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 (NULL), - CPropertySheet(nIDCaption, pParentWnd, iSelectPage) + : CPropertySheet(nIDCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(ring)) { - REF_PTR_SET (m_RenderObj, ring); Initialize (); return ; } @@ -69,10 +68,9 @@ RingPropertySheetClass::RingPropertySheetClass CWnd * pParentWnd, UINT iSelectPage ) - : m_RenderObj (NULL), - CPropertySheet(pszCaption, pParentWnd, iSelectPage) + : CPropertySheet(pszCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(ring)) { - REF_PTR_SET (m_RenderObj, ring); Initialize (); return ; } @@ -85,7 +83,6 @@ RingPropertySheetClass::RingPropertySheetClass ///////////////////////////////////////////////////////////////////////////// RingPropertySheetClass::~RingPropertySheetClass (void) { - REF_PTR_RELEASE (m_RenderObj); return ; } @@ -183,7 +180,7 @@ RingPropertySheetClass::Add_Object_To_Viewer (void) // // 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,17 +198,17 @@ RingPropertySheetClass::Add_Object_To_Viewer (void) // // Display the object - // - doc->Reload_Displayed_Object (); - m_LastSavedName = m_RenderObj->Get_Name (); - REF_PTR_SET (m_RenderObj, (RingRenderObjClass *)doc->GetDisplayedObject ()); + // + doc->Reload_Displayed_Object (); + m_LastSavedName = m_RenderObj->Get_Name (); + 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()); } return ; @@ -248,9 +245,9 @@ RingPropertySheetClass::Initialize (void) // // 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 @@ -277,13 +274,13 @@ RingPropertySheetClass::Initialize (void) void RingPropertySheetClass::Create_New_Object (void) { - 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()); return ; } diff --git a/Core/Tools/W3DView/RingPropertySheet.h b/Core/Tools/W3DView/RingPropertySheet.h index d221010715..5c1e302636 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/ScreenCursor.cpp b/Core/Tools/W3DView/ScreenCursor.cpp index 28917a34f4..0c83ba9d69 100644 --- a/Core/Tools/W3DView/ScreenCursor.cpp +++ b/Core/Tools/W3DView/ScreenCursor.cpp @@ -53,8 +53,6 @@ /////////////////////////////////////////////////////////////////// ScreenCursorClass::ScreenCursorClass (void) : m_ScreenPos (0, 0), - m_pTexture (NULL), - m_pVertMaterial (NULL), m_Width (0), m_Height (0), m_hWnd (NULL) @@ -71,9 +69,7 @@ ScreenCursorClass::ScreenCursorClass (void) /////////////////////////////////////////////////////////////////// ScreenCursorClass::ScreenCursorClass (const ScreenCursorClass &src) : m_ScreenPos (0, 0), - m_pTexture (NULL), m_hWnd (NULL), - m_pVertMaterial (NULL), m_Width (0), m_Height (0), RenderObjClass (src) @@ -90,8 +86,6 @@ ScreenCursorClass::ScreenCursorClass (const ScreenCursorClass &src) /////////////////////////////////////////////////////////////////// ScreenCursorClass::~ScreenCursorClass (void) { - REF_PTR_RELEASE (m_pTexture); - REF_PTR_RELEASE (m_pVertMaterial); return ; } @@ -104,10 +98,8 @@ ScreenCursorClass::~ScreenCursorClass (void) void ScreenCursorClass::Initialize (void) { - 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); @@ -153,7 +145,7 @@ ScreenCursorClass::Initialize (void) 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 != NULL) { @@ -303,9 +295,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 3227d2ddd9..774f9752a3 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]; diff --git a/Core/Tools/W3DView/SpherePropertySheet.cpp b/Core/Tools/W3DView/SpherePropertySheet.cpp index 400f73d631..344b2ed2b3 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 (NULL), - CPropertySheet(nIDCaption, pParentWnd, iSelectPage) + : CPropertySheet(nIDCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(sphere)) { - REF_PTR_SET (m_RenderObj, sphere); Initialize (); return ; } @@ -69,10 +68,9 @@ SpherePropertySheetClass::SpherePropertySheetClass CWnd * pParentWnd, UINT iSelectPage ) - : m_RenderObj (NULL), - CPropertySheet(pszCaption, pParentWnd, iSelectPage) + : CPropertySheet(pszCaption, pParentWnd, iSelectPage), + m_RenderObj (RefCountPtr::Create_AddRef(sphere)) { - REF_PTR_SET (m_RenderObj, sphere); Initialize (); return ; } @@ -85,7 +83,6 @@ SpherePropertySheetClass::SpherePropertySheetClass ///////////////////////////////////////////////////////////////////////////// SpherePropertySheetClass::~SpherePropertySheetClass (void) { - REF_PTR_RELEASE (m_RenderObj); return ; } @@ -183,7 +180,7 @@ SpherePropertySheetClass::Add_Object_To_Viewer (void) // // 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,17 +198,17 @@ SpherePropertySheetClass::Add_Object_To_Viewer (void) // // Display the object - // - doc->Reload_Displayed_Object (); - m_LastSavedName = m_RenderObj->Get_Name (); - REF_PTR_SET (m_RenderObj, (SphereRenderObjClass *)doc->GetDisplayedObject ()); + // + doc->Reload_Displayed_Object (); + m_LastSavedName = m_RenderObj->Get_Name (); + 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()); } return ; @@ -248,9 +245,9 @@ SpherePropertySheetClass::Initialize (void) // // 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 @@ -277,13 +274,13 @@ SpherePropertySheetClass::Initialize (void) void SpherePropertySheetClass::Create_New_Object (void) { - 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()); return ; } diff --git a/Core/Tools/W3DView/SpherePropertySheet.h b/Core/Tools/W3DView/SpherePropertySheet.h index 65b9a5777c..2fbff64f2b 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; }; diff --git a/Core/Tools/W3DView/W3DViewDoc.cpp b/Core/Tools/W3DView/W3DViewDoc.cpp index 1594b53859..2eb43ffa15 100644 --- a/Core/Tools/W3DView/W3DViewDoc.cpp +++ b/Core/Tools/W3DView/W3DViewDoc.cpp @@ -130,7 +130,6 @@ CW3DViewDoc::CW3DViewDoc (void) CW3DViewDoc::~CW3DViewDoc (void) { CleanupResources (); - REF_PTR_RELEASE (m_pCursor); return ; } @@ -171,15 +170,16 @@ CW3DViewDoc::CleanupResources (void) if (m_pCursor != NULL) { m_pCursor->Remove (); + m_pCursor.Clear(); } - 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) @@ -238,14 +238,10 @@ CW3DViewDoc::CleanupResources (void) m_pCSceneLight = NULL; } - // 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(); return ; } @@ -268,7 +264,7 @@ CW3DViewDoc::OnNewDocument (void) 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) @@ -280,13 +276,10 @@ CW3DViewDoc::OnNewDocument (void) 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) @@ -395,12 +388,12 @@ CW3DViewDoc::InitScene (void) m_pC2DScene = new SimpleSceneClass; ASSERT (m_pC2DScene); - // Instantiate a new 2D cursor scene - m_pCursorScene = new SimpleSceneClass; - ASSERT (m_pCursorScene); + // Instantiate a new 2D cursor scene + 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; @@ -608,26 +601,24 @@ CW3DViewDoc::Display_Emitter // Data OK? if (m_pCScene != NULL) { - // Lose the animation - SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); + // Lose the animation + SAFE_DELETE (m_pCAnimCombo); + m_pCAnimation.Clear(); - if (m_pCRenderObj != NULL) { - - // Remove this object from the scene - Remove_Object_From_Scene (m_pCRenderObj); - m_pCRenderObj->Release_Ref (); - m_pCRenderObj = NULL; - } - m_pCScene->Clear_Lineup(); + if (m_pCRenderObj != NULL) { + // 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 != NULL) { + // Do we have a new emitter to display? + if (pemitter != NULL) { - // Add the emitter to the scene - pemitter->Set_Transform (Matrix3D (1)); - REF_PTR_SET (m_pCRenderObj, pemitter); - m_pCScene->Add_Render_Object (m_pCRenderObj); + // Add the emitter to the scene + pemitter->Set_Transform (Matrix3D (1)); + m_pCRenderObj = RefCountPtr::Create_AddRef(pemitter); + m_pCScene->Add_Render_Object (m_pCRenderObj.Peek()); pemitter->Start (); CGraphicView *pCGraphicView = GetGraphicView (); @@ -669,16 +660,13 @@ CW3DViewDoc::DisplayObject { // Lose the animation SAFE_DELETE (m_pCAnimCombo); - REF_PTR_RELEASE (m_pCAnimation); // 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 = NULL; + Remove_Object_From_Scene (m_pCRenderObj.Peek()); + m_pCRenderObj.Clear(); } } m_pCScene->Clear_Lineup(); @@ -689,21 +677,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 (); @@ -836,7 +823,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 (); @@ -874,9 +861,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 = RefCountPtr::Create_NoAddRef(WW3DAssetManager::Get_Instance()->Get_HAnim (pszAnimationName)); + ASSERT (m_pCAnimation.Peek()); // Reset the frame counter m_CurrentFrame = 0; @@ -885,7 +871,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) @@ -966,10 +952,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 = 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 @@ -1053,8 +1038,8 @@ CW3DViewDoc::Update_Camera (void) // Should we update the camera's position as well? if (m_bAnimateCamera && m_pCRenderObj != NULL) { - Matrix3D transform (1); - if (Get_Camera_Transform (m_pCRenderObj, transform)) { + Matrix3D transform (1); + 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); @@ -1118,9 +1103,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 (); @@ -1879,7 +1864,7 @@ CW3DViewDoc::Remove_Object_From_Scene (RenderObjClass *prender_obj) { // If the render object is NULL, then remove the current render object if (prender_obj == NULL) { - prender_obj = m_pCRenderObj; + prender_obj = m_pCRenderObj.Peek(); } // Recursively remove objects from the scene (to make sure we get all particle buffers) @@ -2443,7 +2428,7 @@ CW3DViewDoc::Make_Movie (void) 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 @@ -2465,7 +2450,7 @@ CW3DViewDoc::Make_Movie (void) 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) { @@ -2525,7 +2510,7 @@ CW3DViewDoc::Build_Emitter_List // If the render object is NULL, then start from the current render object // if (render_obj == NULL) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } // @@ -2604,7 +2589,7 @@ void CW3DViewDoc::Create_Cursor (void) { if (m_pCursor == NULL) { - 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")); } @@ -2627,7 +2612,7 @@ CW3DViewDoc::Count_Particles (RenderObjClass *render_obj) // If the render object is NULL, then start from the current render object // if (render_obj == NULL) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } // @@ -2687,7 +2672,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 == NULL) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } // @@ -2727,7 +2712,7 @@ CW3DViewDoc::Toggle_Alternate_Materials(RenderObjClass * render_obj) // If the render object is NULL, start from the current render object // if (render_obj == NULL) { - render_obj = m_pCRenderObj; + render_obj = m_pCRenderObj.Peek(); } if (render_obj != NULL) { diff --git a/Core/Tools/W3DView/W3DViewDoc.h b/Core/Tools/W3DView/W3DViewDoc.h index cab9ffd9b1..f5879770c9 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 (void) const { return m_pC2DCamera; } CameraClass * GetBackObjectCamera (void) const { return m_pCBackObjectCamera; } SceneClass * Get2DScene (void) const { return m_pC2DScene; } - SceneClass * GetCursorScene (void) const { return m_pCursorScene; } + SceneClass * GetCursorScene (void) const { return m_pCursorScene.Peek(); } ViewerSceneClass * GetScene (void) const { return m_pCScene; } SceneClass * GetBackObjectScene (void) const { return m_pCBackObjectScene; } LightClass * GetSceneLight (void) const { return m_pCSceneLight; } - RenderObjClass * GetDisplayedObject (void) const { return m_pCRenderObj; } - HAnimClass * GetCurrentAnimation (void) const { return m_pCAnimation; } + RenderObjClass * GetDisplayedObject (void) const { return m_pCRenderObj.Peek(); } + HAnimClass * GetCurrentAnimation (void) const { return m_pCAnimation.Peek(); } const HTreeClass * Get_Current_HTree (void) 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;