📄 engineobject.cpp
字号:
}
BOOL CEngineObject::Attach(CEngineObject* pToObject,char* szObjectName)
{
if(m_GXOHandle == NULL) return FALSE;
return g_pExecutive->GXOAttach(m_GXOHandle,pToObject->m_GXOHandle,szObjectName);
}
void CEngineObject::Detach(CEngineObject* pChildObject)
{
if(m_GXOHandle == NULL) return;
BOOL rt = g_pExecutive->GXODetach(m_GXOHandle,pChildObject->m_GXOHandle);
}
void CEngineObject::DrawFitInViewPort(int ViewPortNum,float fFOV)
{
if(m_GXOHandle == NULL) return;
g_pExecutive->SetCameraFitGXObject(m_GXOHandle,1,1000,fFOV,ViewPortNum);
g_pExecutive->GetGeometry()->SetAmbientColor(ViewPortNum,0xffffffff);
g_pExecutive->GetGeometry()->BeginRender(ViewPortNum,0xffff0000,BEGIN_RENDER_FLAG_DONOT_CLEAR_FRAMEBUFFER);
g_pExecutive->GXORender(m_GXOHandle);
g_pExecutive->GetGeometry()->EndRender();
}
void CEngineObject::SetScale(VECTOR3* pScale)
{
if(m_GXOHandle == NULL) return;
g_pExecutive->GXOSetScale(m_GXOHandle,pScale);
}
void CEngineObject::GetScale(VECTOR3* pScale)
{
if(m_GXOHandle == NULL) return;
g_pExecutive->GXOGetScale(m_GXOHandle,pScale);
}
BOOL CEngineObject::ChangePart(int PartNum,char* pFileName)
{
if(m_GXOHandle == NULL) return FALSE;
if(m_pObject->m_EngineObjectType == eEngineObjectType_Character)
DIRECTORYMGR->SetLoadMode(eLM_Character);
else if(m_pObject->m_EngineObjectType == eEngineObjectType_Monster)
DIRECTORYMGR->SetLoadMode(eLM_Monster);
else if(m_pObject->m_EngineObjectType == eEngineObjectType_Npc)
DIRECTORYMGR->SetLoadMode(eLM_Npc);
else if(m_pObject->m_EngineObjectType == eEngineObjectType_Effect)
DIRECTORYMGR->SetLoadMode(eLM_Effect);
else if(m_pObject->m_EngineObjectType == eEngineObjectType_Weapon)
DIRECTORYMGR->SetLoadMode(eLM_Character);
BOOL rt = g_pExecutive->GXOReplaceModel(m_GXOHandle,PartNum,pFileName);
DIRECTORYMGR->SetLoadMode(eLM_Root);
return rt;
}
void CEngineObject::ApplyHeightField(BOOL bApply)
{
if(m_GXOHandle == NULL) return;
m_bApplyHeight = bApply;
if(g_bFixHeight)
return;
if(bApply)
g_pExecutive->GXOEnableHFieldApply(m_GXOHandle);
else
g_pExecutive->GXODisableHFieldApply(m_GXOHandle);
}
void CEngineObject::EnableShadow(BOOL bShadow)
{
if(m_GXOHandle == NULL) return;
if(bShadow)
g_pExecutive->EnableSendShadow(m_GXOHandle);
else
g_pExecutive->DisableSendShadow(m_GXOHandle);
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->EnableShadow(bShadow);
PTRLISTSEARCHEND
PTRLISTSEARCHSTART(m_AttachedDress,CEngineObject*,pDress)
pDress->EnableShadow(bShadow);
PTRLISTSEARCHEND
}
void CEngineObject::SetAlpha(float Alpha)
{
if(m_GXOHandle == NULL) return;
DWORD dAlpha = (DWORD)(Alpha * 255);
if(dAlpha == 0)
dAlpha = 1;
g_pExecutive->SetAlphaFlag(m_GXOHandle,dAlpha);
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->SetAlpha(Alpha);
PTRLISTSEARCHEND
PTRLISTSEARCHSTART(m_AttachedDress,CEngineObject*,pDress)
pDress->SetAlpha(Alpha);
PTRLISTSEARCHEND
}
void CEngineObject::EnablePick()
{
if(m_GXOHandle == NULL) return;
g_pExecutive->EnablePick(m_GXOHandle);
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->EnablePick();
PTRLISTSEARCHEND
PTRLISTSEARCHSTART(m_AttachedDress,CEngineObject*,pDress)
pDress->EnablePick();
PTRLISTSEARCHEND
}
void CEngineObject::DisablePick()
{
if(m_GXOHandle == NULL) return;
g_pExecutive->DisablePick(m_GXOHandle);
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->DisablePick();
PTRLISTSEARCHEND
PTRLISTSEARCHSTART(m_AttachedDress,CEngineObject*,pDress)
pDress->DisablePick();
PTRLISTSEARCHEND
}
void CEngineObject::EnableSelfIllumin()
{
if(m_GXOHandle == NULL) return;
g_pExecutive->GXOEnableSelfIllumin(m_GXOHandle);
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->EnableSelfIllumin();
PTRLISTSEARCHEND
PTRLISTSEARCHSTART(m_AttachedDress,CEngineObject*,pDress)
pDress->EnableSelfIllumin();
PTRLISTSEARCHEND
}
void CEngineObject::DisableSelfIllumin()
{
if(m_GXOHandle == NULL) return;
g_pExecutive->GXODisableSelfIllumin(m_GXOHandle);
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->DisableSelfIllumin();
PTRLISTSEARCHEND
PTRLISTSEARCHSTART(m_AttachedDress,CEngineObject*,pDress)
pDress->DisableSelfIllumin();
PTRLISTSEARCHEND
}
BOOL CEngineObject::IsVisible()
{
if(m_GXOHandle == NULL) return FALSE;
return g_pExecutive->IsInViewVolume(m_GXOHandle);
}
void CEngineObject::InitializeIllusionEffect(DWORD MaxIllusionFrame,void* pMtl)
{
return;
if(m_GXOHandle == NULL) return;
/*
void* pMtlHandle = NULL;
MATERIAL mtl;
memset(&mtl, 0, sizeof(mtl));
mtl.dwDiffuse = 0xffffffff;
mtl.dwAmbient = 0xffffffff;
mtl.dwFlag = TRANSP_TYPE_ADDITIVE;
lstrcpy(mtl.szDiffuseTexmapFileName,"d:\\work\\CWorking\\3ddata\\Effect\\mo2.tga"); // 捞 概磐府倔捞 荤侩且 咆胶媚 颇老
// 概磐府倔 积己. 鞘夸绝霸登搁 馆靛矫 秦力秦具茄促.
pMtlHandle = g_pExecutive->GetRenderer()->CreateMaterial( &mtl,NULL,NULL, 0);
*/
BOOL rt = g_pExecutive->GXOInitializeIllusionEffect(m_GXOHandle,MaxIllusionFrame,"_ILLUSION_MESH",pMtl,0);
}
void CEngineObject::BeginIllusionEffect()
{
return;
if(m_GXOHandle == NULL) return;
g_pExecutive->GXOBeginIllusionEffect(m_GXOHandle);
}
void CEngineObject::EndIllusionEffect()
{
return;
if(m_GXOHandle == NULL) return;
g_pExecutive->GXOEndIllusionEffect(m_GXOHandle);
}
DWORD CEngineObject::GetAnimationTime(DWORD MotionNum)
{
if(m_GXOHandle == NULL) return 1;
if(MotionNum == (DWORD)-1) return 0;
ANIINFO* AniInfo = m_AniInfo->GetAniInfo(MotionNum);
MOTION_DESC pMotionDesc;
g_pExecutive->GXOGetMotionDesc(m_GXOHandle,&pMotionDesc,AniInfo->EngineMotionIndex,0);
DWORD lastFrame = pMotionDesc.dwLastFrame < AniInfo->EndFrame ?
pMotionDesc.dwLastFrame : AniInfo->EndFrame;
DWORD startFrame = AniInfo->StartFrame;
if(startFrame > lastFrame)
{
MessageBox(NULL,"StartFrame is bigger than LastFrame. Check chi File",0,0);
return 0;
}
DWORD frame = lastFrame - startFrame;
return (DWORD)(frame * gTickPerFrame);
}
void CEngineObject::RandMotionFrame()
{
if(m_GXOHandle == NULL) return;
DWORD MotionNum = m_CurMotionNum;
MOTION_DESC pMotionDesc;
g_pExecutive->GXOGetMotionDesc(m_GXOHandle,&pMotionDesc,MotionNum,0);
ANIINFO* AniInfo = m_AniInfo->GetAniInfo(MotionNum);
DWORD aniinfo = AniInfo->EndFrame - AniInfo->StartFrame;
DWORD frame = pMotionDesc.dwLastFrame < aniinfo ?
pMotionDesc.dwLastFrame : aniinfo;
if(pMotionDesc.dwLastFrame == 0)
{
if(AniInfo->EndFrame == (WORD)-1)
{
g_pExecutive->GXOGetMotionDesc(m_GXOHandle,&pMotionDesc,AniInfo->EngineMotionIndex,0);
frame = pMotionDesc.dwLastFrame - AniInfo->StartFrame;
}
else
frame = aniinfo;
}
DWORD rrr = rand() % frame;
g_pExecutive->GXOSetCurrentFrame(m_GXOHandle,rrr);
}
void CEngineObject::SetDirection(VECTOR3* pDir)
{
if(m_GXOHandle == NULL) return;
if(pDir->x == 0 && pDir->y == 0 && pDir->z == 0)
return;
VECTOR3 ypr;
ypr.x = (float)(atan2(pDir->y, roughGetLength(pDir->x,pDir->z)));
ypr.y = -(float)(atan2(pDir->z, pDir->x) + gPHI/2.f);
ypr.z = 0;
g_pExecutive->GXOSetDirectionFPSStyle(m_GXOHandle,&ypr);
}
void CEngineObject::AttachToCamera(float fDist)
{
if(m_GXOHandle == NULL) return;
g_pExecutive->GXOAttachCameraFront(m_GXOHandle,fDist);
}
void CEngineObject::DetachFromCamera()
{
if(m_GXOHandle == NULL) return;
g_pExecutive->GXODetachCameraFront(m_GXOHandle);
}
//////////////////////////////////////////////////////////////////////////
BOOL CEngineObject::AttachWeapon(CEngineObject* pWeaponObject,char* szObjectName)
{
BOOL rt = pWeaponObject->Attach(this,szObjectName);
if(rt)
m_AttachedWeapon.AddHead(pWeaponObject);
return rt;
}
BOOL CEngineObject::AttachDress(CEngineObject* pDressObject,char* szObjectName)
{
BOOL rt = pDressObject->Attach(this,szObjectName);
if(rt)
m_AttachedDress.AddHead(pDressObject);
return rt;
}
void CEngineObject::RemoveAllAttachedWeapon()
{
CEngineObject* pAttachedWeapon;
while(pAttachedWeapon = (CEngineObject*)m_AttachedWeapon.RemoveTail())
{
Detach(pAttachedWeapon);
delete pAttachedWeapon;
}
}
void CEngineObject::RemoveAllAttachedDress()
{
CEngineObject* pDressObject;
while(pDressObject = (CEngineObject*)m_AttachedDress.RemoveTail())
{
Detach(pDressObject);
delete pDressObject;
}
}
void CEngineObject::StartWeaponIllusion(DWORD MaxIllusionFrame,void* pMtl)
{
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->InitializeIllusionEffect(MaxIllusionFrame,pMtl);
pWeapon->BeginIllusionEffect();
PTRLISTSEARCHEND
}
void CEngineObject::EndWeaponIllusion()
{
PTRLISTSEARCHSTART(m_AttachedWeapon,CEngineObject*,pWeapon)
pWeapon->EndIllusionEffect();
PTRLISTSEARCHEND
}
void CEngineObject::LinkTo(CEngineObject* pParent)
{
if(pParent != m_pObjectLinkTo)
{
if(m_pObjectLinkTo)
m_pObjectLinkTo->m_LinkedObject.Remove(this);
if(pParent)
pParent->m_LinkedObject.AddTail(this);
m_pObjectLinkTo = pParent;
}
}
DWORD __stdcall MHPlayerPROC(I4DyuchiGXExecutive* pExecutive, GXMAP_OBJECT_HANDLE gxh, DWORD msg, int arg1, int arg2, void* pData)
{
CEngineObject* pObject = (CEngineObject*)pData;
if(pObject == NULL)
return 0;
if(arg1)
pObject->Animate(arg1);
if(pObject->m_pObject)
pObject->m_pObject->Process();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -