diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68ef687b..970232db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,7 +59,8 @@ jobs: run: | sudo apt-get update sudo apt-get install -y \ - libx11-dev libxext-dev libxrandr-dev libxrender-dev libxfixes-dev libxi-dev libxinerama-dev libxcursor-dev libwayland-dev libxkbcommon-dev wayland-protocols + libx11-dev libxext-dev libxrandr-dev libxrender-dev libxfixes-dev libxi-dev libxinerama-dev \ + libxcursor-dev libwayland-dev libxkbcommon-dev wayland-protocols - name: Install macOS dependencies (brew) if: ${{ matrix.brew }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 9dbaab25..8edd07da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,6 +144,7 @@ target_include_directories(Vec::Vec INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/vec" add_library(lego1 SHARED LEGO1/main.cpp ) +target_precompile_headers(lego1 PRIVATE "LEGO1/lego1_pch.h") set_property(TARGET lego1 PROPERTY DEFINE_SYMBOL "LEGO1_DLL") target_include_directories(lego1 PUBLIC "$") target_include_directories(lego1 PUBLIC "$") diff --git a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp index c0e6d1ed..8f152f91 100644 --- a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp +++ b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp @@ -223,11 +223,15 @@ MxLong RegistrationBook::HandleKeyPress(SDL_Keycode p_key) // FUNCTION: LEGO1 0x100774a0 MxLong RegistrationBook::HandleControl(LegoControlManagerNotificationParam& p_param) { - MxS16 unk0x28 = p_param.m_unk0x28; + MxS16 buttonId = p_param.m_unk0x28; - if (unk0x28 >= 1 && unk0x28 <= 28) { + if (buttonId >= 1 && buttonId <= 28) { if (p_param.m_clickedObjectId == RegbookScript::c_Alphabet_Ctl) { - if (unk0x28 == 28) { + // buttonId: + // - [1, 26]: alphabet + // - 27: backspace + // - 28: go back to information center + if (buttonId == 28) { DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav); if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { @@ -240,14 +244,15 @@ MxLong RegistrationBook::HandleControl(LegoControlManagerNotificationParam& p_pa TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); } else { - if (unk0x28 > 28) { + if (buttonId > 28) { return 1; } - HandleKeyPress(unk0x28 < 27 ? unk0x28 + 64 : 8); + HandleKeyPress(buttonId < 27 ? SDLK_A + buttonId - 1 : SDLK_BACKSPACE); } } else { + // Select another profile (buttonId is always 1) InputManager()->DisableInputProcessing(); DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav); diff --git a/LEGO1/lego1_pch.h b/LEGO1/lego1_pch.h new file mode 100644 index 00000000..e9c429a6 --- /dev/null +++ b/LEGO1/lego1_pch.h @@ -0,0 +1,309 @@ +#ifndef LEGO1_PCH_H +#define LEGO1_PCH_H + +#include "define.h" +#include "lego/legoomni/include/act2actor.h" +#include "lego/legoomni/include/act2brick.h" +#include "lego/legoomni/include/act2genactor.h" +#include "lego/legoomni/include/act2policestation.h" +#include "lego/legoomni/include/act3.h" +#include "lego/legoomni/include/act3actors.h" +#include "lego/legoomni/include/act3ammo.h" +#include "lego/legoomni/include/actions/act2main_actions.h" +#include "lego/legoomni/include/actions/act3_actions.h" +#include "lego/legoomni/include/actions/actionsfwd.h" +#include "lego/legoomni/include/actions/carrace_actions.h" +#include "lego/legoomni/include/actions/carracer_actions.h" +#include "lego/legoomni/include/actions/copter_actions.h" +#include "lego/legoomni/include/actions/credits_actions.h" +#include "lego/legoomni/include/actions/dunecar_actions.h" +#include "lego/legoomni/include/actions/elevbott_actions.h" +#include "lego/legoomni/include/actions/garage_actions.h" +#include "lego/legoomni/include/actions/histbook_actions.h" +#include "lego/legoomni/include/actions/hospital_actions.h" +#include "lego/legoomni/include/actions/infodoor_actions.h" +#include "lego/legoomni/include/actions/infomain_actions.h" +#include "lego/legoomni/include/actions/infoscor_actions.h" +#include "lego/legoomni/include/actions/intro_actions.h" +#include "lego/legoomni/include/actions/isle_actions.h" +#include "lego/legoomni/include/actions/jetrace_actions.h" +#include "lego/legoomni/include/actions/jetracer_actions.h" +#include "lego/legoomni/include/actions/jetski_actions.h" +#include "lego/legoomni/include/actions/jukebox_actions.h" +#include "lego/legoomni/include/actions/jukeboxw_actions.h" +#include "lego/legoomni/include/actions/nocd_actions.h" +#include "lego/legoomni/include/actions/police_actions.h" +#include "lego/legoomni/include/actions/racecar_actions.h" +#include "lego/legoomni/include/actions/regbook_actions.h" +#include "lego/legoomni/include/actions/sndanim_actions.h" +#include "lego/legoomni/include/ambulance.h" +#include "lego/legoomni/include/bike.h" +#include "lego/legoomni/include/buildingentity.h" +#include "lego/legoomni/include/buildings.h" +#include "lego/legoomni/include/bumpbouy.h" +#include "lego/legoomni/include/carrace.h" +#include "lego/legoomni/include/doors.h" +#include "lego/legoomni/include/dunebuggy.h" +#include "lego/legoomni/include/elevatorbottom.h" +#include "lego/legoomni/include/extra.h" +#include "lego/legoomni/include/gasstation.h" +#include "lego/legoomni/include/helicopter.h" +#include "lego/legoomni/include/historybook.h" +#include "lego/legoomni/include/hospital.h" +#include "lego/legoomni/include/infocenter.h" +#include "lego/legoomni/include/infocenterdoor.h" +#include "lego/legoomni/include/isle.h" +#include "lego/legoomni/include/isleactor.h" +#include "lego/legoomni/include/islepathactor.h" +#include "lego/legoomni/include/jetski.h" +#include "lego/legoomni/include/jetskirace.h" +#include "lego/legoomni/include/jukebox.h" +#include "lego/legoomni/include/jukeboxentity.h" +#include "lego/legoomni/include/lego3dsound.h" +#include "lego/legoomni/include/lego3dwavepresenter.h" +#include "lego/legoomni/include/legoact2.h" +#include "lego/legoomni/include/legoactioncontrolpresenter.h" +#include "lego/legoomni/include/legoactor.h" +#include "lego/legoomni/include/legoactorpresenter.h" +#include "lego/legoomni/include/legoactors.h" +#include "lego/legoomni/include/legoanimactor.h" +#include "lego/legoomni/include/legoanimationmanager.h" +#include "lego/legoomni/include/legoanimmmpresenter.h" +#include "lego/legoomni/include/legoanimpresenter.h" +#include "lego/legoomni/include/legobuildingmanager.h" +#include "lego/legoomni/include/legocachesoundlist.h" +#include "lego/legoomni/include/legocachesoundmanager.h" +#include "lego/legoomni/include/legocachsound.h" +#include "lego/legoomni/include/legocameracontroller.h" +#include "lego/legoomni/include/legocarbuild.h" +#include "lego/legoomni/include/legocarbuildpresenter.h" +#include "lego/legoomni/include/legocharactermanager.h" +#include "lego/legoomni/include/legocontrolmanager.h" +#include "lego/legoomni/include/legoendanimnotificationparam.h" +#include "lego/legoomni/include/legoentity.h" +#include "lego/legoomni/include/legoentitylist.h" +#include "lego/legoomni/include/legoentitypresenter.h" +#include "lego/legoomni/include/legoeventnotificationparam.h" +#include "lego/legoomni/include/legoextraactor.h" +#include "lego/legoomni/include/legoflctexturepresenter.h" +#include "lego/legoomni/include/legogamestate.h" +#include "lego/legoomni/include/legohideanimpresenter.h" +#include "lego/legoomni/include/legoinputmanager.h" +#include "lego/legoomni/include/legoloadcachesoundpresenter.h" +#include "lego/legoomni/include/legolocations.h" +#include "lego/legoomni/include/legolocomotionanimpresenter.h" +#include "lego/legoomni/include/legolodlist.h" +#include "lego/legoomni/include/legoloopinganimpresenter.h" +#include "lego/legoomni/include/legomain.h" +#include "lego/legoomni/include/legometerpresenter.h" +#include "lego/legoomni/include/legomodelpresenter.h" +#include "lego/legoomni/include/legonamedpart.h" +#include "lego/legoomni/include/legonamedpartlist.h" +#include "lego/legoomni/include/legonamedplane.h" +#include "lego/legoomni/include/legonamedtexture.h" +#include "lego/legoomni/include/legonamedtexturelist.h" +#include "lego/legoomni/include/legonavcontroller.h" +#include "lego/legoomni/include/legoobjectfactory.h" +#include "lego/legoomni/include/legopalettepresenter.h" +#include "lego/legoomni/include/legopartpresenter.h" +#include "lego/legoomni/include/legopathactor.h" +#include "lego/legoomni/include/legopathboundary.h" +#include "lego/legoomni/include/legopathcontroller.h" +#include "lego/legoomni/include/legopathcontrollerlist.h" +#include "lego/legoomni/include/legopathedgecontainer.h" +#include "lego/legoomni/include/legopathpresenter.h" +#include "lego/legoomni/include/legopathstruct.h" +#include "lego/legoomni/include/legophoneme.h" +#include "lego/legoomni/include/legophonemelist.h" +#include "lego/legoomni/include/legophonemepresenter.h" +#include "lego/legoomni/include/legoplantmanager.h" +#include "lego/legoomni/include/legoplants.h" +#include "lego/legoomni/include/legopointofviewcontroller.h" +#include "lego/legoomni/include/legorace.h" +#include "lego/legoomni/include/legoraceactor.h" +#include "lego/legoomni/include/legoracemap.h" +#include "lego/legoomni/include/legoracers.h" +#include "lego/legoomni/include/legoracespecial.h" +#include "lego/legoomni/include/legoroilist.h" +#include "lego/legoomni/include/legoroimaplist.h" +#include "lego/legoomni/include/legosoundmanager.h" +#include "lego/legoomni/include/legostate.h" +#include "lego/legoomni/include/legotextureinfo.h" +#include "lego/legoomni/include/legotexturepresenter.h" +#include "lego/legoomni/include/legotraninfo.h" +#include "lego/legoomni/include/legotraninfolist.h" +#include "lego/legoomni/include/legoutils.h" +#include "lego/legoomni/include/legovariables.h" +#include "lego/legoomni/include/legovideomanager.h" +#include "lego/legoomni/include/legoworld.h" +#include "lego/legoomni/include/legoworldlist.h" +#include "lego/legoomni/include/legoworldpresenter.h" +#include "lego/legoomni/include/misc.h" +#include "lego/legoomni/include/motorcycle.h" +#include "lego/legoomni/include/mxbackgroundaudiomanager.h" +#include "lego/legoomni/include/mxcompositemediapresenter.h" +#include "lego/legoomni/include/mxcontrolpresenter.h" +#include "lego/legoomni/include/mxtransitionmanager.h" +#include "lego/legoomni/include/pizza.h" +#include "lego/legoomni/include/pizzeria.h" +#include "lego/legoomni/include/police.h" +#include "lego/legoomni/include/racecar.h" +#include "lego/legoomni/include/raceskel.h" +#include "lego/legoomni/include/radio.h" +#include "lego/legoomni/include/registrationbook.h" +#include "lego/legoomni/include/score.h" +#include "lego/legoomni/include/scripts.h" +#include "lego/legoomni/include/skateboard.h" +#include "lego/legoomni/include/towtrack.h" +#include "lego/sources/3dmanager/lego3dmanager.h" +#include "lego/sources/3dmanager/lego3dview.h" +#include "lego/sources/3dmanager/legoview1.h" +#include "lego/sources/3dmanager/tglsurface.h" +#include "lego/sources/anim/legoanim.h" +#include "lego/sources/geom/legoedge.h" +#include "lego/sources/geom/legounkown100db7f4.h" +#include "lego/sources/geom/legoweedge.h" +#include "lego/sources/geom/legowegedge.h" +#include "lego/sources/misc/legocontainer.h" +#include "lego/sources/misc/legoimage.h" +#include "lego/sources/misc/legostorage.h" +#include "lego/sources/misc/legotexture.h" +#include "lego/sources/misc/legotree.h" +#include "lego/sources/misc/legotypes.h" +#include "lego/sources/misc/legounknown.h" +#include "lego/sources/misc/legoutil.h" +#include "lego/sources/misc/version.h" +#include "lego/sources/roi/legolod.h" +#include "lego/sources/roi/legoroi.h" +#include "lego/sources/shape/legobox.h" +#include "lego/sources/shape/legocolor.h" +#include "lego/sources/shape/legomesh.h" +#include "lego/sources/shape/legosphere.h" +#include "lego/sources/shape/legovertex.h" +#include "lego1_export.h" +#include "lego1_pch.h" +#include "library_msvc.h" +#include "library_smack.h" +#include "modeldb/modeldb.h" +#include "mxdirectx/legodxinfo.h" +#include "mxdirectx/mxdirect3d.h" +#include "mxdirectx/mxdirectdraw.h" +#include "mxdirectx/mxdirectxinfo.h" +#include "mxdirectx/mxstopwatch.h" +#include "mxgeometry/mxgeometry3d.h" +#include "mxgeometry/mxgeometry4d.h" +#include "mxgeometry/mxmatrix.h" +#include "mxgeometry/mxquaternion.h" +#include "omni/include/flic.h" +#include "omni/include/mxactionnotificationparam.h" +#include "omni/include/mxatom.h" +#include "omni/include/mxaudiomanager.h" +#include "omni/include/mxaudiopresenter.h" +#include "omni/include/mxautolock.h" +#include "omni/include/mxbitmap.h" +#include "omni/include/mxbitset.h" +#include "omni/include/mxcollection.h" +#include "omni/include/mxcompositepresenter.h" +#include "omni/include/mxcore.h" +#include "omni/include/mxcriticalsection.h" +#include "omni/include/mxdebug.h" +#include "omni/include/mxdiskstreamcontroller.h" +#include "omni/include/mxdiskstreamprovider.h" +#include "omni/include/mxdisplaysurface.h" +#include "omni/include/mxdsaction.h" +#include "omni/include/mxdsactionlist.h" +#include "omni/include/mxdsanim.h" +#include "omni/include/mxdsbuffer.h" +#include "omni/include/mxdschunk.h" +#include "omni/include/mxdsevent.h" +#include "omni/include/mxdsfile.h" +#include "omni/include/mxdsmediaaction.h" +#include "omni/include/mxdsmultiaction.h" +#include "omni/include/mxdsobject.h" +#include "omni/include/mxdsobjectaction.h" +#include "omni/include/mxdsparallelaction.h" +#include "omni/include/mxdsselectaction.h" +#include "omni/include/mxdsserialaction.h" +#include "omni/include/mxdssound.h" +#include "omni/include/mxdssource.h" +#include "omni/include/mxdsstill.h" +#include "omni/include/mxdsstreamingaction.h" +#include "omni/include/mxdssubscriber.h" +#include "omni/include/mxentity.h" +#include "omni/include/mxeventmanager.h" +#include "omni/include/mxeventpresenter.h" +#include "omni/include/mxflcpresenter.h" +#include "omni/include/mxgeometry.h" +#include "omni/include/mxhashtable.h" +#include "omni/include/mxio.h" +#include "omni/include/mxlist.h" +#include "omni/include/mxloopingflcpresenter.h" +#include "omni/include/mxloopingsmkpresenter.h" +#include "omni/include/mxmediamanager.h" +#include "omni/include/mxmediapresenter.h" +#include "omni/include/mxmemorypool.h" +#include "omni/include/mxmisc.h" +#include "omni/include/mxnextactiondatastart.h" +#include "omni/include/mxnotificationmanager.h" +#include "omni/include/mxnotificationparam.h" +#include "omni/include/mxobjectfactory.h" +#include "omni/include/mxomni.h" +#include "omni/include/mxomnicreateflags.h" +#include "omni/include/mxomnicreateparam.h" +#include "omni/include/mxpalette.h" +#include "omni/include/mxparam.h" +#include "omni/include/mxpresenter.h" +#include "omni/include/mxpresenterlist.h" +#include "omni/include/mxqueue.h" +#include "omni/include/mxramstreamcontroller.h" +#include "omni/include/mxramstreamprovider.h" +#include "omni/include/mxregion.h" +#include "omni/include/mxscheduler.h" +#include "omni/include/mxsemaphore.h" +#include "omni/include/mxsmk.h" +#include "omni/include/mxsmkpresenter.h" +#include "omni/include/mxsoundmanager.h" +#include "omni/include/mxsoundpresenter.h" +#include "omni/include/mxstillpresenter.h" +#include "omni/include/mxstreamchunk.h" +#include "omni/include/mxstreamchunklist.h" +#include "omni/include/mxstreamcontroller.h" +#include "omni/include/mxstreamer.h" +#include "omni/include/mxstreamprovider.h" +#include "omni/include/mxstring.h" +#include "omni/include/mxstringlist.h" +#include "omni/include/mxthread.h" +#include "omni/include/mxticklemanager.h" +#include "omni/include/mxticklethread.h" +#include "omni/include/mxtimer.h" +#include "omni/include/mxtypes.h" +#include "omni/include/mxutilities.h" +#include "omni/include/mxutilitylist.h" +#include "omni/include/mxvariable.h" +#include "omni/include/mxvariabletable.h" +#include "omni/include/mxvideomanager.h" +#include "omni/include/mxvideoparam.h" +#include "omni/include/mxvideoparamflags.h" +#include "omni/include/mxvideopresenter.h" +#include "omni/include/mxwavepresenter.h" +#include "realtime/lodlist.h" +#include "realtime/matrix.h" +#include "realtime/matrix4d.inl.h" +#include "realtime/orientableroi.h" +#include "realtime/realtime.h" +#include "realtime/realtimeview.h" +#include "realtime/roi.h" +#include "realtime/vector.h" +#include "realtime/vector2d.inl.h" +#include "realtime/vector3d.inl.h" +#include "realtime/vector4d.inl.h" +#include "res/resource.h" +#include "tgl/d3drm/impl.h" +#include "tgl/tgl.h" +#include "tgl/tglvector.h" +#include "viewmanager/viewlod.h" +#include "viewmanager/viewlodlist.h" +#include "viewmanager/viewmanager.h" +#include "viewmanager/viewroi.h" + +#endif diff --git a/LEGO1/omni/include/mxhashtable.h b/LEGO1/omni/include/mxhashtable.h index e15128e9..65ce11a0 100644 --- a/LEGO1/omni/include/mxhashtable.h +++ b/LEGO1/omni/include/mxhashtable.h @@ -13,7 +13,7 @@ class MxHashTableCursor; template class MxHashTableNode { public: - MxHashTableNode(T p_obj, MxU32 p_hash, MxHashTableNode* p_prev, MxHashTableNode* p_next) + MxHashTableNode(T p_obj, MxU32 p_hash, MxHashTableNode* p_prev, MxHashTableNode* p_next) { m_obj = p_obj; m_hash = p_hash; diff --git a/LEGO1/realtime/matrix.h b/LEGO1/realtime/matrix.h index bbadcdf2..ceadf97f 100644 --- a/LEGO1/realtime/matrix.h +++ b/LEGO1/realtime/matrix.h @@ -22,6 +22,8 @@ class Matrix4 { // FUNCTION: BETA10 0x1000fc70 Matrix4(float (*p_data)[4]) { SetData(p_data); } + virtual ~Matrix4() {} + inline virtual void Equals(float (*p_data)[4]); // vtable+0x04 inline virtual void Equals(const Matrix4& p_matrix); // vtable+0x00 inline virtual void SetData(float (*p_data)[4]); // vtable+0x0c diff --git a/miniwin/miniwin/include/miniwin_d3drm.h b/miniwin/miniwin/include/miniwin_d3drm.h index c2835e89..dfd8b66f 100644 --- a/miniwin/miniwin/include/miniwin_d3drm.h +++ b/miniwin/miniwin/include/miniwin_d3drm.h @@ -145,7 +145,6 @@ struct D3DRMVERTEX { }; struct IDirect3DRMObject : public IUnknown { - virtual HRESULT Clone(void** ppObject) = 0; virtual HRESULT AddDestroyCallback(D3DRMOBJECTCALLBACK callback, void* arg) = 0; virtual HRESULT DeleteDestroyCallback(D3DRMOBJECTCALLBACK callback, void* arg) = 0; virtual HRESULT SetAppData(LPD3DRM_APPDATA appData) = 0; diff --git a/miniwin/miniwin/src/miniwin_d3drm.cpp b/miniwin/miniwin/src/miniwin_d3drm.cpp index b4ed7f87..6bd62a08 100644 --- a/miniwin/miniwin/src/miniwin_d3drm.cpp +++ b/miniwin/miniwin/src/miniwin_d3drm.cpp @@ -188,11 +188,6 @@ struct Direct3DRMObjectBase : public T { }; struct Direct3DRMMeshImpl : public Direct3DRMObjectBase { - HRESULT Clone(void** ppObject) override - { - *ppObject = static_cast(new Direct3DRMMeshImpl); - return DD_OK; - } HRESULT Clone(int flags, GUID iid, void** object) override { if (SDL_memcmp(&iid, &IID_IDirect3DRMMesh, sizeof(GUID)) == 0) { @@ -259,11 +254,6 @@ struct Direct3DRMTextureImpl : public Direct3DRMObjectBase SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Direct3DRMTextureImpl does not implement guid"); return E_NOINTERFACE; } - HRESULT Clone(void** ppObject) override - { - *ppObject = static_cast(new Direct3DRMTextureImpl); - return DD_OK; - } HRESULT Changed(BOOL pixels, BOOL palette) override { return DD_OK; } }; @@ -274,11 +264,6 @@ struct Direct3DRMDevice2Impl : public Direct3DRMObjectBase { m_viewports->AddRef(); } ~Direct3DRMDevice2Impl() override { m_viewports->Release(); } - HRESULT Clone(void** ppObject) override - { - *ppObject = static_cast(new Direct3DRMDevice2Impl); - return DD_OK; - } unsigned int GetWidth() override { return 640; } unsigned int GetHeight() override { return 480; } HRESULT SetBufferCount(int count) override { return DD_OK; } @@ -324,11 +309,6 @@ struct Direct3DRMFrameImpl : public Direct3DRMObjectBase { m_texture->Release(); } } - HRESULT Clone(void** ppObject) override - { - *ppObject = static_cast(new Direct3DRMFrameImpl); - return DD_OK; - } HRESULT AddChild(IDirect3DRMFrame* child) override { return m_children->AddElement(child); } HRESULT DeleteChild(IDirect3DRMFrame* child) override { return m_children->DeleteElement(child); } HRESULT SetSceneBackgroundRGB(float r, float g, float b) override { return DD_OK; } @@ -390,11 +370,6 @@ struct Direct3DRMFrameImpl : public Direct3DRMObjectBase { }; struct Direct3DRMViewportImpl : public Direct3DRMObjectBase { - HRESULT Clone(void** ppObject) override - { - *ppObject = static_cast(new Direct3DRMViewportImpl); - return DD_OK; - } HRESULT Render(IDirect3DRMFrame* group) override { return DD_OK; } HRESULT ForceUpdate(int x, int y, int w, int h) override { return DD_OK; } HRESULT Clear() override { return DD_OK; } @@ -427,21 +402,10 @@ struct Direct3DRMViewportImpl : public Direct3DRMObjectBase }; struct Direct3DRMLightImpl : public Direct3DRMObjectBase { - HRESULT Clone(void** ppObject) override - { - *ppObject = static_cast(new Direct3DRMLightImpl); - return DD_OK; - } HRESULT SetColorRGB(float r, float g, float b) override { return DD_OK; } }; -struct Direct3DRMMaterialImpl : public Direct3DRMObjectBase { - HRESULT Clone(void** ppObject) override - { - *ppObject = static_cast(new Direct3DRMMaterialImpl); - return DD_OK; - } -}; +struct Direct3DRMMaterialImpl : public Direct3DRMObjectBase {}; struct Direct3DRMImpl : virtual public IDirect3DRM2 { // IUnknown interface