| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- // MainFrm.cpp : implementation of the CMainFrame class
- //
- #include "stdafx.h"
- #include "PhysTest.h"
- #include "MainFrm.h"
- #include "PhysTestDoc.h"
- #include "GraphicView.h"
- #include "DataView.h"
- #include "PhysicsConstantsDialog.h"
- #include "VJoyDialog.h"
- #include "InertiaDialog.h"
- #include "RbodyPropertiesDialog.h"
- #include "MotorVehicleDialog.h"
- #include "WheeledVehicleDialog.h"
- #include "MotorcycleDialog.h"
- #include "RenderDeviceDialog.h"
- #include "assetmgr.h"
- #include "ww3d.h"
- #include "part_ldr.h"
- #include "pscene.h"
- #include "rbody.h"
- #include "motorvehicle.h"
- #include "wheelvehicle.h"
- #include "motorcycle.h"
- #include "chunkio.h"
- const float IMPULSE_SCALE = 3.0f;
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CMainFrame CHUNK Id's
- enum {
- MAINFRAME_CHUNK_VARIABLES = 0x00800760,
- MAINFRAME_CHUNK_TREEVIEW,
- MAINFRAME_CHUNK_GRAPHICVIEW,
- MAINFRAME_VARIABLE_CONTROLLERPTR = 0x00,
- };
- /////////////////////////////////////////////////////////////////////////////
- // CMainFrame
- IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
- BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
- //{{AFX_MSG_MAP(CMainFrame)
- ON_WM_CREATE()
- ON_WM_ACTIVATEAPP()
- ON_COMMAND(ID_OPTIONS_RUN_SIMULATION, OnOptionsRunSimulation)
- ON_UPDATE_COMMAND_UI(ID_OPTIONS_RUN_SIMULATION, OnUpdateOptionsRunSimulation)
- ON_COMMAND(ID_OPTIONS_DISPLAY_BOXES, OnOptionsDisplayBoxes)
- ON_UPDATE_COMMAND_UI(ID_OPTIONS_DISPLAY_BOXES, OnUpdateOptionsDisplayBoxes)
- ON_COMMAND(ID_CREATE_RIGID_BODY, OnCreateRigidBody)
- ON_UPDATE_COMMAND_UI(ID_COUPLE_NEGX, OnUpdateImpulseButton)
- ON_COMMAND(ID_COUPLE_NEGX, OnCoupleNegx)
- ON_COMMAND(ID_COUPLE_NEGY, OnCoupleNegy)
- ON_COMMAND(ID_COUPLE_NEGZ, OnCoupleNegz)
- ON_COMMAND(ID_COUPLE_POSX, OnCouplePosx)
- ON_COMMAND(ID_COUPLE_POSY, OnCouplePosy)
- ON_COMMAND(ID_COUPLE_POSZ, OnCouplePosz)
- ON_COMMAND(ID_IMPULSE_NEGX, OnImpulseNegx)
- ON_COMMAND(ID_IMPULSE_NEGY, OnImpulseNegy)
- ON_COMMAND(ID_IMPULSE_NEGZ, OnImpulseNegz)
- ON_COMMAND(ID_IMPULSE_POSX, OnImpulsePosx)
- ON_COMMAND(ID_IMPULSE_POSY, OnImpulsePosy)
- ON_COMMAND(ID_IMPULSE_POSZ, OnImpulsePosz)
- ON_COMMAND(ID_VIEW_IMPULSETOOLBAR, OnViewImpulsetoolbar)
- ON_UPDATE_COMMAND_UI(ID_VIEW_IMPULSETOOLBAR, OnUpdateViewImpulsetoolbar)
- ON_COMMAND(ID_PROPERTIES, OnProperties)
- ON_COMMAND(ID_INERTIA, OnInertia)
- ON_COMMAND(ID_OPTIONS_PHYSICS_CONSTANTS, OnOptionsPhysicsConstants)
- ON_COMMAND(ID_FREEZE_OBJECT, OnFreezeObject)
- ON_COMMAND(ID_DEBUG_OBJECT, OnDebugObject)
- ON_UPDATE_COMMAND_UI(ID_DEBUG_OBJECT, OnUpdateDebugObject)
- ON_COMMAND(ID_VIEW_VIRTUALJOYSTICK, OnViewVirtualjoystick)
- ON_UPDATE_COMMAND_UI(ID_VIEW_VIRTUALJOYSTICK, OnUpdateViewVirtualjoystick)
- ON_WM_DESTROY()
- ON_COMMAND(ID_OPTIONS_FILLED, OnOptionsFilled)
- ON_UPDATE_COMMAND_UI(ID_OPTIONS_FILLED, OnUpdateOptionsFilled)
- ON_COMMAND(ID_OPTIONS_POINTS, OnOptionsPoints)
- ON_UPDATE_COMMAND_UI(ID_OPTIONS_POINTS, OnUpdateOptionsPoints)
- ON_COMMAND(ID_OPTIONS_WIREFRAME, OnOptionsWireframe)
- ON_UPDATE_COMMAND_UI(ID_OPTIONS_WIREFRAME, OnUpdateOptionsWireframe)
- ON_COMMAND(ID_MOTOR_PROPERTIES, OnMotorProperties)
- ON_COMMAND(ID_WHEEL_PROPERTIES, OnWheelProperties)
- ON_UPDATE_COMMAND_UI(ID_WHEEL_PROPERTIES, OnUpdateWheelProperties)
- ON_UPDATE_COMMAND_UI(ID_MOTOR_PROPERTIES, OnUpdateMotorProperties)
- ON_COMMAND(ID_CAMERA_FOLLOW, OnCameraFollow)
- ON_UPDATE_COMMAND_UI(ID_CAMERA_FOLLOW, OnUpdateCameraFollow)
- ON_COMMAND(ID_CAMERA_FLY, OnCameraFly)
- ON_UPDATE_COMMAND_UI(ID_CAMERA_FLY, OnUpdateCameraFly)
- ON_COMMAND(ID_CAMERA_TETHER, OnCameraTether)
- ON_UPDATE_COMMAND_UI(ID_CAMERA_TETHER, OnUpdateCameraTether)
- ON_COMMAND(ID_CAMERA_RIGID_TETHER, OnCameraRigidTether)
- ON_UPDATE_COMMAND_UI(ID_CAMERA_RIGID_TETHER, OnUpdateCameraRigidTether)
- ON_COMMAND(ID_CREATE_WHEELED_VEHICLE, OnCreateWheeledVehicle)
- ON_UPDATE_COMMAND_UI(ID_CREATE_RIGID_BODY, OnUpdateCreateRigidBody)
- ON_UPDATE_COMMAND_UI(ID_CREATE_WHEELED_VEHICLE, OnUpdateCreateWheeledVehicle)
- ON_UPDATE_COMMAND_UI(ID_PROPERTIES, OnUpdateProperties)
- ON_COMMAND(ID_CREATE_MOTORCYCLE, OnCreateMotorcycle)
- ON_UPDATE_COMMAND_UI(ID_CREATE_MOTORCYCLE, OnUpdateCreateMotorcycle)
- ON_COMMAND(ID_MOTORCYCLE_PROPERTIES, OnMotorcycleProperties)
- ON_UPDATE_COMMAND_UI(ID_MOTORCYCLE_PROPERTIES, OnUpdateMotorcycleProperties)
- ON_COMMAND(ID_OPTIONS_RENDER_DEVICE, OnOptionsRenderDevice)
- ON_UPDATE_COMMAND_UI(ID_OPTIONS_RENDER_DEVICE, OnUpdateOptionsRenderDevice)
- ON_COMMAND(ID_FILE_IMPORT_MODEL, OnFileImportModel)
- ON_COMMAND(ID_FILE_IMPORT_LEV, OnFileImportLev)
- ON_UPDATE_COMMAND_UI(ID_COUPLE_NEGY, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_COUPLE_NEGZ, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_COUPLE_POSX, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_COUPLE_POSY, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_COUPLE_POSZ, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_IMPULSE_NEGX, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_IMPULSE_NEGY, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_IMPULSE_NEGZ, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_IMPULSE_POSX, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_IMPULSE_POSY, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_IMPULSE_POSZ, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_INERTIA, OnUpdateImpulseButton)
- ON_UPDATE_COMMAND_UI(ID_FREEZE_OBJECT, OnUpdateImpulseButton)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- static UINT indicators[] =
- {
- ID_SEPARATOR, // status line indicator
- ID_INDICATOR_CAPS,
- ID_INDICATOR_NUM,
- ID_INDICATOR_SCRL,
- };
- /////////////////////////////////////////////////////////////////////////////
- // CMainFrame construction/destruction
- CMainFrame::CMainFrame() :
- VirtualJoystick(NULL),
- ControlledObject(NULL)
- {
- }
- CMainFrame::~CMainFrame()
- {
- REF_PTR_RELEASE(ControlledObject);
- }
- BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
- {
- if( !CFrameWnd::PreCreateWindow(cs) )
- return FALSE;
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- return TRUE;
- }
- int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
- return -1;
- if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
- | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
- !m_wndToolBar.LoadToolBar(IDR_MAINTOOLBAR))
- {
- TRACE0("Failed to create toolbar\n");
- return -1; // fail to create
- }
- if (!m_wndImpulseToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
- | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
- !m_wndImpulseToolBar.LoadToolBar(IDR_IMPULSE_TOOLBAR))
- {
- TRACE0("Failed to create impulse toolbar\n");
- return -1; // fail to create
- }
- if (!m_wndStatusBar.Create(this) ||
- !m_wndStatusBar.SetIndicators(indicators,
- sizeof(indicators)/sizeof(UINT)))
- {
- TRACE0("Failed to create status bar\n");
- return -1; // fail to create
- }
- // Make the toolbar dockable
- m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
- m_wndImpulseToolBar.EnableDocking(CBRS_ALIGN_ANY);
- EnableDocking(CBRS_ALIGN_ANY);
- DockControlBar(&m_wndToolBar);
- DockControlBar(&m_wndImpulseToolBar);
- // Make sure load on demand is activated
- WW3DAssetManager::Get_Instance()->Set_WW3D_Load_On_Demand (true);
- // Create the virtual joystick dialog
- VirtualJoystick = new CVJoyDialog;
- VirtualJoystick->Create(IDD_VJOY_DIALOG,this);
- return 0;
- }
- void CMainFrame::OnDestroy()
- {
- CFrameWnd::OnDestroy();
-
- if (VirtualJoystick != NULL) {
- VirtualJoystick->DestroyWindow();
- delete VirtualJoystick;
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- // CMainFrame Save/Load
- void CMainFrame::Save(ChunkSaveClass & csave)
- {
- PhysControllerClass * controlptr = &(VirtualJoystick->Controller);
- csave.Begin_Chunk(MAINFRAME_CHUNK_VARIABLES);
- WRITE_MICRO_CHUNK(csave,MAINFRAME_VARIABLE_CONTROLLERPTR,controlptr);
- csave.End_Chunk();
- csave.Begin_Chunk(MAINFRAME_CHUNK_TREEVIEW);
- CDataView * data_view = (CDataView *)Splitter.GetPane(0,0);
- data_view->Save(csave);
- csave.End_Chunk();
- csave.Begin_Chunk(MAINFRAME_CHUNK_GRAPHICVIEW);
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- graphic_view->Save(csave);
- csave.End_Chunk();
- }
- void CMainFrame::Load(ChunkLoadClass & cload)
- {
- PhysControllerClass * controlptr = NULL;
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- CDataView * data_view = (CDataView *)Splitter.GetPane(0,0);
-
- while (cload.Open_Chunk()) {
- switch (cload.Cur_Chunk_ID()) {
- case MAINFRAME_CHUNK_VARIABLES:
- while (cload.Open_Micro_Chunk()) {
- switch(cload.Cur_Micro_Chunk_ID()) {
- READ_MICRO_CHUNK(cload,MAINFRAME_VARIABLE_CONTROLLERPTR,controlptr);
- }
- cload.Close_Micro_Chunk();
- }
- break;
- case MAINFRAME_CHUNK_TREEVIEW:
- data_view->Load(cload);
- break;
- case MAINFRAME_CHUNK_GRAPHICVIEW:
- graphic_view->Load(cload);
- break;
- }
- cload.Close_Chunk();
- }
- if (controlptr != NULL) {
- SaveLoadSystemClass::Register_Pointer(controlptr,&(VirtualJoystick->Controller));
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- // CMainFrame diagnostics
- #ifdef _DEBUG
- void CMainFrame::AssertValid() const
- {
- CFrameWnd::AssertValid();
- }
- void CMainFrame::Dump(CDumpContext& dc) const
- {
- CFrameWnd::Dump(dc);
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CMainFrame message handlers
- BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
- {
- // Create the main splitter window for the application
- BOOL ok = Splitter.CreateStatic (this, 1, 2);
- ASSERT(ok);
- if (!ok) return FALSE;
- // Create the two views
- ok &= Splitter.CreateView(0,0,RUNTIME_CLASS(CDataView),CSize(200,10),pContext);
- ok &= Splitter.CreateView(0,1,RUNTIME_CLASS(CGraphicView),CSize(340,10),pContext);
- ASSERT(ok);
- if (!ok) return FALSE;
- CGraphicView * view = (CGraphicView *)Splitter.GetPane(0, 1);
- ASSERT(view != NULL);
- if (view == NULL) return FALSE;
- // Set the current directory to the application's run directory.
- TCHAR szFileName[MAX_PATH];
- ::GetModuleFileName (NULL, szFileName, sizeof (szFileName));
- LPTSTR pszPath = ::strrchr (szFileName, '\\');
- if (pszPath)
- {
- pszPath[0] = 0;
- ::SetCurrentDirectory (szFileName);
- }
- // Initialize WW3D using the window handle for the graphic view
- ok = (WW3D::Init((HWND)*view) == WW3D_ERROR_OK);
- ASSERT(ok);
- if (!ok) return FALSE;
- #if 0
- // Show a dialog to the user asking them which
- // device they would like to use.
- CDeviceSelectionDialog deviceSelDialog;
- if (deviceSelDialog.DoModal () == IDOK) {
- // Record the user's selection from the dialog
- int device = deviceSelDialog.GetDeviceIndex();
- int bits = deviceSelDialog.GetBitsPerPixel();
- // Ask the view to initialize itself with the graphics engine
- bool ok = view->Initialize_WW3D(device,bits);
- ASSERT(ok);
- } else {
- // Stop the application from running
- return FALSE;
- }
- #else
- view->Initialize_WW3D(0,16);
- #endif
- // Register any needed loaders
- WW3DAssetManager::Get_Instance()->Register_Prototype_Loader (&_ParticleEmitterLoader);
- return TRUE;
- }
- void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask)
- {
- // Get a pointer to the 'graphic' pane's window
- CGraphicView * view = (CGraphicView *)Splitter.GetPane(0,1);
- // Were we successful in view's getting the pointer?
- ASSERT(view);
- if (view) {
- // Let the view know whether or not to actively update
- // its display (animation, etc)
- view->Set_Active(bActive == TRUE);
- }
- // Allow the base class to process this message
- CFrameWnd::OnActivateApp(bActive, hTask);
- return ;
- }
- void CMainFrame::OnOptionsRunSimulation()
- {
- CGraphicView * view = (CGraphicView *)Splitter.GetPane(0,1);
- ASSERT(view);
- if (view) {
- view->Enable_Simulation(!view->Is_Simulation_Enabled());
- }
- }
- void CMainFrame::OnUpdateOptionsRunSimulation(CCmdUI* pCmdUI)
- {
- CGraphicView * view = (CGraphicView *)Splitter.GetPane(0,1);
- ASSERT(view);
-
- if (view) {
- pCmdUI->SetCheck(view->Is_Simulation_Enabled());
- }
- }
- void CMainFrame::OnOptionsDisplayBoxes()
- {
- CGraphicView * view = (CGraphicView *)Splitter.GetPane(0,1);
- ASSERT(view);
- if (view) {
- view->Enable_Collision_Box_Display(!view->Is_Collision_Box_Display_Enabled());
- }
- }
- void CMainFrame::OnUpdateOptionsDisplayBoxes(CCmdUI* pCmdUI)
- {
- CGraphicView * view = (CGraphicView *)Splitter.GetPane(0,1);
- ASSERT(view);
-
- if (view) {
- pCmdUI->SetCheck(view->Is_Collision_Box_Display_Enabled());
- }
- }
- void CMainFrame::Add_Object(PhysClass * new_obj)
- {
- CPhysTestDoc * doc = Get_Document();
- new_obj->Set_Transform(Matrix3D(1));
- new_obj->Set_Collision_Group(0);
- new_obj->Enable_Debug_Display(true);
- CString name;
- name.Format("%s_%2d",new_obj->Peek_Model()->Get_Name(),doc->Get_Physics_Object_Count());
- new_obj->Set_Name(name);
- if (doc != NULL) {
- doc->Add_Physics_Object(new_obj);
- }
- }
- CPhysTestDoc * CMainFrame::Get_Document(void)
- {
- CDataView * data_view = (CDataView *)Splitter.GetPane(0,0);
- CPhysTestDoc * doc = (CPhysTestDoc *)data_view->GetDocument();
- return doc;
- }
- void CMainFrame::OnCreateRigidBody()
- {
- const char * model_name = Peek_Selected_Model();
- if (model_name == NULL) return;
- RenderObjClass * model = WW3DAssetManager::Get_Instance()->Create_Render_Obj(model_name);
- if (model == NULL) return;
- RigidBodyClass * obj = NEW_REF(RigidBodyClass,());
- obj->Set_Model(model);
- obj->Enable_Shadow_Generation(true);
- Add_Object(obj);
- obj->Release_Ref();
- model->Release_Ref();
- }
- void CMainFrame::OnUpdateCreateRigidBody(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_Model() != NULL);
- }
- void CMainFrame::OnCreateWheeledVehicle()
- {
- const char * model_name = Peek_Selected_Model();
- if (model_name == NULL) return;
- RenderObjClass * model = WW3DAssetManager::Get_Instance()->Create_Render_Obj(model_name);
- if (model == NULL) return;
- WheeledVehicleClass * obj = NEW_REF(WheeledVehicleClass,());
- obj->Set_Model(model);
- obj->Enable_Shadow_Generation(true);
- Add_Object(obj);
- obj->Release_Ref();
- model->Release_Ref();
- }
- void CMainFrame::OnUpdateCreateWheeledVehicle(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_Model() != NULL);
- }
- void CMainFrame::OnCreateMotorcycle()
- {
- const char * model_name = Peek_Selected_Model();
- if (model_name == NULL) return;
- RenderObjClass * model = WW3DAssetManager::Get_Instance()->Create_Render_Obj(model_name);
- if (model == NULL) return;
- MotorcycleClass * obj = NEW_REF(MotorcycleClass,());
- obj->Set_Model(model);
- obj->Enable_Shadow_Generation(true);
- Add_Object(obj);
- obj->Release_Ref();
- model->Release_Ref();
- }
- void CMainFrame::OnUpdateCreateMotorcycle(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_Model() != NULL);
- }
- const char * CMainFrame::Peek_Selected_Model(void)
- {
- CDataView * data_view = (CDataView *)Splitter.GetPane(0,0);
- CPhysTestDoc * doc = (CPhysTestDoc *)data_view->GetDocument();
- if ((data_view == NULL) || (doc == NULL)) return NULL;
-
- // get the currently selected instance
- ItemInfoClass * item = data_view->Get_Selected_Item();
- if (item == NULL) return NULL;
- if (item->Type != ItemInfoClass::MODEL) return NULL;
- return item->Name;
- }
- PhysClass * CMainFrame::Peek_Selected_Object(void)
- {
- CDataView * data_view = (CDataView *)Splitter.GetPane(0,0);
- CPhysTestDoc * doc = (CPhysTestDoc *)data_view->GetDocument();
- if ((data_view == NULL) || (doc == NULL)) return NULL;
-
- // get the currently selected instance
- ItemInfoClass * item = data_view->Get_Selected_Item();
- if (item == NULL) return NULL;
- if (item->Type != ItemInfoClass::INSTANCE) return NULL;
- PhysClass * obj = (PhysClass *)item->Instance;
- return obj;
- }
- MoveablePhysClass * CMainFrame::Peek_Selected_MoveablePhysClass(void)
- {
- PhysClass * obj = Peek_Selected_Object();
- if (obj) {
- return obj->As_MoveablePhysClass();
- }
- return NULL;
- }
- RigidBodyClass * CMainFrame::Peek_Selected_RigidBodyClass(void)
- {
- PhysClass * obj = Peek_Selected_Object();
- if (obj) {
- return obj->As_RigidBodyClass();
- }
- return NULL;
- }
- MotorVehicleClass * CMainFrame::Peek_Selected_MotorVehicleClass(void)
- {
- PhysClass * obj = Peek_Selected_Object();
- if (obj) {
- return obj->As_MotorVehicleClass();
- }
- return NULL;
- }
- WheeledVehicleClass * CMainFrame::Peek_Selected_WheeledVehicleClass(void)
- {
- PhysClass * obj = Peek_Selected_Object();
- if (obj) {
- return obj->As_WheeledVehicleClass();
- }
- return NULL;
- }
- MotorcycleClass * CMainFrame::Peek_Selected_MotorcycleClass(void)
- {
- PhysClass * obj = Peek_Selected_Object();
- if (obj) {
- return obj->As_MotorcycleClass();
- }
- return NULL;
- }
- void CMainFrame::Apply_Impulse(const Vector3 & imp)
- {
- RigidBodyClass * rbody = Peek_Selected_RigidBodyClass();
- if (rbody) {
- // impulses were "tuned" to work with a 1kg object, so scale by the mass
- rbody->Apply_Impulse(rbody->Get_Mass() * IMPULSE_SCALE * imp);
- }
- }
- void CMainFrame::Apply_Couple(const Vector3 & p0,const Vector3 & i0,const Vector3 & p1,const Vector3 & i1)
- {
- RigidBodyClass * rbody = Peek_Selected_RigidBodyClass();
- if (rbody) {
- // impulses were "tuned" to work with a 1kg object, so scale by the mass
- Vector3 pos = rbody->Get_Transform().Get_Translation() + p0;
- rbody->Apply_Impulse(rbody->Get_Mass() * IMPULSE_SCALE * i0,pos);
- pos = rbody->Get_Transform().Get_Translation() + p1;
- rbody->Apply_Impulse(rbody->Get_Mass() * IMPULSE_SCALE * i1,pos);
- }
- }
- void CMainFrame::OnUpdateImpulseButton(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_RigidBodyClass() != NULL);
- }
- void CMainFrame::OnCoupleNegx()
- {
- Apply_Couple( Vector3( 0, 1, 0), // p0
- Vector3( 0, 0, 1), // i0
- Vector3( 0,-1, 0), // p1
- Vector3( 0, 0,-1) // i1
- );
- }
- void CMainFrame::OnCoupleNegy()
- {
- Apply_Couple( Vector3( 1, 0, 0), // p0
- Vector3( 0, 0, 1), // i0
- Vector3(-1, 0, 0), // p1
- Vector3( 0, 0,-1) // i1
- );
- }
- void CMainFrame::OnCoupleNegz()
- {
- Apply_Couple( Vector3( 0, 1, 0), // p0
- Vector3( 1, 0, 0), // i0
- Vector3( 0,-1, 0), // p1
- Vector3(-1, 0, 0) // i1
- );
- }
- void CMainFrame::OnCouplePosx()
- {
- Apply_Couple( Vector3( 0,-1, 0), // p0
- Vector3( 0, 0, 1), // i0
- Vector3( 0, 1, 0), // p1
- Vector3( 0, 0,-1) // i1
- );
- }
- void CMainFrame::OnCouplePosy()
- {
- Apply_Couple( Vector3( 1, 0, 0), // p0
- Vector3( 0, 0,-1), // i0
- Vector3(-1, 0, 0), // p1
- Vector3( 0, 0, 1) // i1
- );
- }
- void CMainFrame::OnCouplePosz()
- {
- Apply_Couple( Vector3( 0, 1, 0), // p0
- Vector3(-1, 0, 0), // i0
- Vector3( 0,-1, 0), // p1
- Vector3( 1, 0, 0) // i1
- );
- }
- void CMainFrame::OnImpulseNegx()
- {
- Apply_Impulse(Vector3(-1,0,0));
- }
- void CMainFrame::OnImpulseNegy()
- {
- Apply_Impulse(Vector3(0,-1,0));
- }
- void CMainFrame::OnImpulseNegz()
- {
- Apply_Impulse(Vector3(0,0,-1));
- }
- void CMainFrame::OnImpulsePosx()
- {
- Apply_Impulse(Vector3(1,0,0));
- }
- void CMainFrame::OnImpulsePosy()
- {
- Apply_Impulse(Vector3(0,1,0));
- }
- void CMainFrame::OnImpulsePosz()
- {
- Apply_Impulse(Vector3(0,0,1));
- }
- void CMainFrame::OnViewImpulsetoolbar()
- {
- ShowControlBar(&m_wndImpulseToolBar,!m_wndImpulseToolBar.IsWindowVisible(),FALSE);
- }
- void CMainFrame::OnUpdateViewImpulsetoolbar(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(m_wndImpulseToolBar.IsWindowVisible());
- }
- void CMainFrame::OnViewVirtualjoystick()
- {
- if (VirtualJoystick) {
- if (VirtualJoystick->IsWindowVisible()) {
- VirtualJoystick->ShowWindow(SW_HIDE);
- } else {
- VirtualJoystick->ShowWindow(SW_SHOW);
- }
- }
- }
- void CMainFrame::OnUpdateViewVirtualjoystick(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(VirtualJoystick && VirtualJoystick->IsWindowVisible());
- }
- void CMainFrame::OnInertia()
- {
- RigidBodyClass * rbody = Peek_Selected_RigidBodyClass();
- if (rbody == NULL) return;
- CInertiaDialog dialog(this,rbody);
- dialog.DoModal();
- }
- void CMainFrame::OnProperties()
- {
- MoveablePhysClass * obj = Peek_Selected_MoveablePhysClass();
- if (obj == NULL) return;
- CRbodyPropertiesDialog dialog(this,obj);
- dialog.DoModal();
- }
- void CMainFrame::OnUpdateProperties(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_MoveablePhysClass() != NULL);
- }
- void CMainFrame::OnMotorProperties()
- {
- MotorVehicleClass * vehicle = Peek_Selected_MotorVehicleClass();
- if (vehicle == NULL) return;
- CMotorVehicleDialog dialog(this,vehicle);
- dialog.DoModal();
- }
- void CMainFrame::OnUpdateMotorProperties(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_MotorVehicleClass() != NULL);
- }
- void CMainFrame::OnMotorcycleProperties()
- {
- MotorcycleClass * cycle = Peek_Selected_MotorcycleClass();
- if (cycle == NULL) return;
- CMotorcycleDialog dialog(this,cycle);
- dialog.DoModal();
- }
- void CMainFrame::OnUpdateMotorcycleProperties(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_MotorVehicleClass() != NULL);
- }
- void CMainFrame::OnWheelProperties()
- {
- WheeledVehicleClass * vehicle = Peek_Selected_WheeledVehicleClass();
- if (vehicle == NULL) return;
- CWheeledVehicleDialog dialog(this,vehicle);
- dialog.DoModal();
- }
- void CMainFrame::OnUpdateWheelProperties(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(Peek_Selected_WheeledVehicleClass() != NULL);
- }
- void CMainFrame::OnOptionsPhysicsConstants()
- {
- CPhysicsConstantsDialog dialog;
- dialog.DoModal();
- }
- void CMainFrame::OnFreezeObject()
- {
- CDataView * data_view = (CDataView *)Splitter.GetPane(0,0);
- CPhysTestDoc * doc = (CPhysTestDoc *)data_view->GetDocument();
- ItemInfoClass * item = data_view->Get_Selected_Item();
- if (item == NULL) return;
- if (item->Type != ItemInfoClass::INSTANCE) return;
-
- RigidBodyClass * rbody = (RigidBodyClass *)item->Instance;
- if (rbody == NULL) return;
- rbody->Set_Velocity(Vector3(0,0,0));
- rbody->Set_Angular_Velocity(Vector3(0,0,0));
- }
- void CMainFrame::Set_Status_Bar_Text(const char * text)
- {
- m_wndStatusBar.SetWindowText(text);
- }
- void CMainFrame::OnDebugObject()
- {
- PhysClass * obj = Peek_Selected_Object();
- obj->Enable_Debug_Display(!obj->Is_Debug_Display_Enabled());
- }
- void CMainFrame::OnUpdateDebugObject(CCmdUI* pCmdUI)
- {
- PhysClass * obj = Peek_Selected_Object();
- if (obj == NULL) {
- pCmdUI->Enable(FALSE);
- } else {
- pCmdUI->Enable(TRUE);
- pCmdUI->SetCheck(obj->Is_Debug_Display_Enabled());
- }
- }
- void CMainFrame::OnOptionsFilled()
- {
- PhysicsSceneClass::Get_Instance()->Set_Polygon_Mode(SceneClass::FILL);
- }
- void CMainFrame::OnUpdateOptionsFilled(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(PhysicsSceneClass::Get_Instance()->Get_Polygon_Mode() == SceneClass::FILL);
- }
- void CMainFrame::OnOptionsPoints()
- {
- PhysicsSceneClass::Get_Instance()->Set_Polygon_Mode(SceneClass::POINT);
- }
- void CMainFrame::OnUpdateOptionsPoints(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(PhysicsSceneClass::Get_Instance()->Get_Polygon_Mode() == SceneClass::POINT);
- }
- void CMainFrame::OnOptionsWireframe()
- {
- PhysicsSceneClass::Get_Instance()->Set_Polygon_Mode(SceneClass::LINE);
- }
- void CMainFrame::OnUpdateOptionsWireframe(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(PhysicsSceneClass::Get_Instance()->Get_Polygon_Mode() == SceneClass::LINE);
- }
- void CMainFrame::Notify_Selection_Changed(void)
- {
- if (ControlledObject != NULL) {
- ControlledObject->Set_Controller(NULL);
- ControlledObject->Release_Ref();
- ControlledObject = NULL;
- }
- ControlledObject = Peek_Selected_MoveablePhysClass();
- if (ControlledObject) {
- ControlledObject->Add_Ref();
- if (VirtualJoystick) {
- ControlledObject->Set_Controller(&VirtualJoystick->Controller);
- }
- }
- }
- void CMainFrame::OnCameraFly()
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view) {
- graphic_view->Set_Camera_Mode(CGraphicView::CAMERA_FLY);
- }
- }
- void CMainFrame::OnUpdateCameraFly(CCmdUI* pCmdUI)
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view && graphic_view->Get_Camera_Mode() == CGraphicView::CAMERA_FLY) {
- pCmdUI->SetCheck(true);
- } else {
- pCmdUI->SetCheck(false);
- }
- }
- void CMainFrame::OnCameraFollow()
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view) {
- graphic_view->Set_Camera_Mode(CGraphicView::CAMERA_FOLLOW);
- }
- }
- void CMainFrame::OnUpdateCameraFollow(CCmdUI* pCmdUI)
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view && graphic_view->Get_Camera_Mode() == CGraphicView::CAMERA_FOLLOW) {
- pCmdUI->SetCheck(true);
- } else {
- pCmdUI->SetCheck(false);
- }
- }
- void CMainFrame::OnCameraTether()
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view) {
- graphic_view->Set_Camera_Mode(CGraphicView::CAMERA_TETHER);
- }
- }
- void CMainFrame::OnUpdateCameraTether(CCmdUI* pCmdUI)
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view && graphic_view->Get_Camera_Mode() == CGraphicView::CAMERA_TETHER) {
- pCmdUI->SetCheck(true);
- } else {
- pCmdUI->SetCheck(false);
- }
- }
- void CMainFrame::OnCameraRigidTether()
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view) {
- graphic_view->Set_Camera_Mode(CGraphicView::CAMERA_RIGID_TETHER);
- }
- }
- void CMainFrame::OnUpdateCameraRigidTether(CCmdUI* pCmdUI)
- {
- CGraphicView * graphic_view = (CGraphicView *)Splitter.GetPane(0,1);
- if (graphic_view && graphic_view->Get_Camera_Mode() == CGraphicView::CAMERA_RIGID_TETHER) {
- pCmdUI->SetCheck(true);
- } else {
- pCmdUI->SetCheck(false);
- }
- }
- void CMainFrame::OnOptionsRenderDevice()
- {
- CRenderDeviceDialog dialog;
- dialog.DoModal();
- }
- void CMainFrame::OnUpdateOptionsRenderDevice(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(WW3D::Is_Initted());
- }
- void CMainFrame::OnFileImportModel()
- {
- // show the file open dialong
- CFileDialog file_dialog( TRUE, // bOpenFileDialog,
- ".W3D", // LPCTSTR lpszDefExt = NULL,
- NULL, // LPCTSTR lpszFileName = NULL,
- OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
- "Westwood 3D Files|*.w3d|"
- );
-
- // read in the file
- if (file_dialog.DoModal()) {
- Get_Document()->Load_W3D_File(file_dialog.GetPathName());
- }
- }
- void CMainFrame::OnFileImportLev()
- {
- // show the file open dialong
- CFileDialog file_dialog( TRUE, // bOpenFileDialog,
- ".LEV", // LPCTSTR lpszDefExt = NULL,
- NULL, // LPCTSTR lpszFileName = NULL,
- OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
- "LEV Files|*.lev|"
- );
-
- // read in the file
- if (file_dialog.DoModal()) {
- Get_Document()->Load_LEV_File(file_dialog.GetPathName());
- }
- }
|