444 lines
11 KiB
C++
444 lines
11 KiB
C++
/*=========================================================================
|
|
* DEVMul3D.cpp : Implementation of Multidevice 3D.
|
|
* This is a part of the PCA project.
|
|
*
|
|
* Version 1.0
|
|
* Creation date 17/07/96
|
|
* Revision date
|
|
*
|
|
*
|
|
* (c) Ubi Studios 1996
|
|
*=======================================================================*/
|
|
|
|
#include "stdafx.h"
|
|
#include "acp_base.h"
|
|
#include "geo.h"
|
|
#include "gli.h"
|
|
#include "itf/CPARes.h"
|
|
#include "itf/DEVMul3D.hpp"
|
|
#include "itf/CPAProj.hpp"
|
|
#include "itf/CPAConst.hpp"
|
|
#include "itf/CPAkacnf.hpp"
|
|
#include "itf/cpaworld.hpp"
|
|
#include "itf/cpasobj.hpp"
|
|
#include "itf/CPAInter.hpp"
|
|
|
|
IMPLEMENT_DYNCREATE(DEV_MultiDevice3D, DEV_MultiDevice)
|
|
|
|
BEGIN_MESSAGE_MAP(DEV_MultiDevice3D, DEV_MultiDevice)
|
|
//{{AFX_MSG_MAP(DEV_MultiDevice3D)
|
|
ON_WM_CREATE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//==========================================================================
|
|
DEV_MultiDevice3D::DEV_MultiDevice3D()
|
|
{
|
|
DEV_MultiDevice3D::Init();
|
|
}
|
|
|
|
DEV_MultiDevice3D::DEV_MultiDevice3D(int flags) :
|
|
DEV_MultiDevice(flags)
|
|
{
|
|
DEV_MultiDevice3D::Init();
|
|
}
|
|
|
|
DEV_MultiDevice3D::~DEV_MultiDevice3D()
|
|
{
|
|
}
|
|
|
|
void DEV_MultiDevice3D::Init(void)
|
|
{
|
|
#ifdef ACTIVE_EDITOR
|
|
m_p_oWorld = NULL;
|
|
#endif // ACTIVE_EDITOR
|
|
|
|
m_hSuperObjectWorld = NULL;
|
|
DEV_MultiDevice::Init();
|
|
}
|
|
|
|
//==========================================================================
|
|
int DEV_MultiDevice3D::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (DEV_MultiDevice::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
//
|
|
// Init light.
|
|
//
|
|
GLI_xCreateLight(&m_hLight , GLI_C_lParallelLight);
|
|
#ifdef ACTIVE_EDITOR
|
|
m_p_oParent = GetParent();
|
|
#endif // ACTIVE_EDITOR
|
|
return 0;
|
|
}
|
|
|
|
#ifdef ACTIVE_EDITOR
|
|
//===========================================================================
|
|
// Description: Set the Rotation Unit.
|
|
// Creation date: 26/07/96
|
|
// Author: LOL
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author:
|
|
//===========================================================================
|
|
/*void DEV_MultiDevice3D::SetRotateUnitIndex(int iIndex, int iMul)
|
|
{
|
|
mxRotateUnit = GLI_M_Mul(C_DefaultRotateUnit, iMul);
|
|
miRotateUnitIndex = iIndex;
|
|
}
|
|
*/
|
|
//===========================================================================
|
|
// Description: Set the Translation Unit.
|
|
// Creation date: 26/07/96
|
|
// Author: LOL
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author:
|
|
//===========================================================================
|
|
/*void DEV_MultiDevice3D::SetTranslateUnitIndex(int iIndex, int iMul)
|
|
{
|
|
mxTranslateUnit = GLI_M_Mul(C_DefaultTranslateUnit, iMul);
|
|
miTranslateUnitIndex = iIndex;
|
|
}
|
|
*/
|
|
|
|
//===========================================================================
|
|
// Description: Sets a new world in the multidevice.
|
|
// this world will be the new current world
|
|
// Creation date: 25/09/96
|
|
// Author: FBF
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author: FBF
|
|
//===========================================================================
|
|
void DEV_MultiDevice3D::SetWorld(CPA_World *p_oWorld)
|
|
{
|
|
if (m_cIsAdditional == 0)
|
|
{
|
|
// if there was allready a world, remove it
|
|
if (m_p_oWorld)
|
|
m_p_oWorld->SetMultiDevice(NULL);
|
|
SetEngineWorld(NULL);
|
|
|
|
m_p_oWorld = p_oWorld;
|
|
|
|
if (m_p_oWorld)
|
|
{
|
|
m_p_oWorld->SetMultiDevice(this);
|
|
if (m_p_oWorld->GetRoot())
|
|
SetEngineWorld(p_oWorld->GetRoot()->GetStruct());
|
|
}
|
|
|
|
if (GetInterface())
|
|
GetInterface()->fn_vChangeWorld();
|
|
}
|
|
else
|
|
{
|
|
GetPane_0_0()->SetWorld(p_oWorld);
|
|
}
|
|
}
|
|
|
|
CPA_World *DEV_MultiDevice3D::GetWorld()
|
|
{
|
|
if (m_cIsAdditional == 0)
|
|
return m_p_oWorld;
|
|
else
|
|
return GetPane_0_0()->GetWorld();
|
|
}
|
|
|
|
GLI_tdxHandleToLight DEV_MultiDevice3D::GetEngineLight()
|
|
{
|
|
if (m_cIsAdditional == 0)
|
|
return m_hLight;
|
|
else
|
|
return GetPane_0_0()->GetEngineLight();
|
|
}
|
|
|
|
|
|
HIE_tdxHandleToSuperObject DEV_MultiDevice3D::GetEngineWorld()
|
|
{
|
|
if (m_cIsAdditional == 0)
|
|
return m_hSuperObjectWorld;
|
|
else
|
|
return GetPane_0_0()->GetEngineWorld();
|
|
}
|
|
|
|
#endif
|
|
|
|
void DEV_MultiDevice3D::SetEngineWorld(HIE_tdxHandleToSuperObject hObj)
|
|
{
|
|
#ifdef ACTIVE_EDITOR
|
|
if (m_cIsAdditional == 0)
|
|
m_hSuperObjectWorld = hObj;
|
|
else
|
|
GetPane_0_0()->SetEngineWorld(hObj);
|
|
#else
|
|
m_hSuperObjectWorld = hObj;
|
|
#endif
|
|
}
|
|
|
|
|
|
#ifdef ACTIVE_EDITOR
|
|
|
|
//===========================================================================
|
|
// Description: Draw the World which is set by the function SetObject.
|
|
// Call the DrawObject function of all his device.
|
|
// Creation date: 26/07/96
|
|
// Author: LOL
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author: CB
|
|
//===========================================================================
|
|
void DEV_MultiDevice3D::DrawObject(void)
|
|
{
|
|
if (!IsActive())
|
|
return;
|
|
if (M_bEditorsActive())
|
|
{
|
|
DrawEditorObject();
|
|
return;
|
|
}
|
|
|
|
UINT i;
|
|
{
|
|
for (i = 0; i < MAX_DEVICE; i++)
|
|
{
|
|
if
|
|
(
|
|
(IsActivDevice(i))
|
|
&&
|
|
(
|
|
(GetDevice(i)->mbGameRefresh)
|
|
|| (M_bEditorsActive())
|
|
|| (mbForceDrawing)
|
|
)
|
|
)
|
|
{
|
|
#ifndef TEST_CPA_VERSION_3D
|
|
if(M_bEditorsActive() || i || (this != M_GetMainDevice()))
|
|
#endif // TEST_CPA_VERSION_3D
|
|
{
|
|
if(m_hSuperObjectWorld)
|
|
GetDevice(i)->DrawObject(m_hLight, m_hSuperObjectWorld);
|
|
else
|
|
GLD_bFlipDevice(GetDevice(i)->m_hDisplayDevice);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if
|
|
(
|
|
(m_p_oParent)
|
|
&& (m_p_oMultiToDraw == NULL)
|
|
&& (m_p_oParent->IsKindOf(RUNTIME_CLASS(FRMSplitter)))
|
|
&& (!mbForceDrawing)
|
|
)
|
|
{
|
|
m_p_oMultiToDraw = this;
|
|
((FRMSplitter *) m_p_oParent)->DrawObject(this);
|
|
m_p_oMultiToDraw = NULL;
|
|
}
|
|
mbForceDrawing = FALSE;
|
|
}
|
|
|
|
//===========================================================================
|
|
// Description: Draw the World which is set by the function SetObject.
|
|
// Call the DrawObject function of all his device.
|
|
// Creation date: 26/07/96
|
|
// Author: LOL
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author: CB
|
|
//===========================================================================
|
|
void DEV_MultiDevice3D::DrawEditorObject(void)
|
|
{
|
|
UINT i;
|
|
|
|
for (i = 0; i < MAX_DEVICE; i++)
|
|
{
|
|
if(IsActivDevice(i))
|
|
{
|
|
if (GetWorld())
|
|
GetDevice(i)->DrawEditorObject(m_hLight, GetWorld()->GetRoot());
|
|
else
|
|
GLD_bFlipDevice(GetDevice(i)->m_hDisplayDevice);
|
|
}
|
|
}
|
|
|
|
if
|
|
(
|
|
(m_p_oParent)
|
|
&& (m_p_oMultiToDraw == NULL)
|
|
&& (m_p_oParent->IsKindOf(RUNTIME_CLASS(FRMSplitter)))
|
|
)
|
|
{
|
|
m_p_oMultiToDraw = this;
|
|
((FRMSplitter *) m_p_oParent)->DrawObject(this);
|
|
m_p_oMultiToDraw = NULL;
|
|
}
|
|
mbForceDrawing = FALSE;
|
|
}
|
|
|
|
void DEV_MultiDevice3D::DrawObjectExcept0()
|
|
{
|
|
UINT i;
|
|
for (i = 1; i < MAX_DEVICE; i++)
|
|
{
|
|
if
|
|
(
|
|
(IsActivDevice(i))
|
|
&& (
|
|
(GetDevice(i)->mbGameRefresh)
|
|
|| (M_bEditorsActive())
|
|
|| (mbForceDrawing)
|
|
)
|
|
)
|
|
{
|
|
if(m_hSuperObjectWorld)
|
|
GetDevice(i)->DrawObject(m_hLight, m_hSuperObjectWorld);
|
|
else
|
|
GLD_bFlipDevice(GetDevice(i)->m_hDisplayDevice);
|
|
}
|
|
}
|
|
|
|
if
|
|
(
|
|
(m_p_oParent)
|
|
&& (m_p_oMultiToDraw == NULL)
|
|
&& (m_p_oParent->IsKindOf(RUNTIME_CLASS(FRMSplitter)))
|
|
&& (!mbForceDrawing)
|
|
)
|
|
{
|
|
m_p_oMultiToDraw = this;
|
|
((FRMSplitter *) m_p_oParent)->DrawObject(this);
|
|
m_p_oMultiToDraw = NULL;
|
|
}
|
|
mbForceDrawing = FALSE;
|
|
}
|
|
#endif // ACTIVE_EDITOR
|
|
|
|
//==========================================================================
|
|
//
|
|
// TO TEST ACP VERSION
|
|
//
|
|
//==========================================================================
|
|
#if defined(ACTIVE_EDITOR)
|
|
|
|
void fn_vRotateX ( POS_tdstCompletePosition *p_stMatrix ,
|
|
GLI_tdxValue xXAngle )
|
|
{
|
|
MTH3D_tdstVector stVectI,stVectJ,stVectK;
|
|
|
|
POS_fn_vGetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
|
|
MTH3D_M_vSetYofVector(&stVectJ,GLI_M_Cos(xXAngle)) ;
|
|
MTH3D_M_vSetZofVector(&stVectJ,GLI_M_Sin(xXAngle)) ;
|
|
MTH3D_M_vSetYofVector(&stVectK,GLI_M_Neg(GLI_M_Sin(xXAngle))) ;
|
|
MTH3D_M_vSetZofVector(&stVectK,GLI_M_Cos(xXAngle)) ;
|
|
|
|
POS_fn_vSetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
}
|
|
|
|
void fn_vRotateY ( POS_tdstCompletePosition *p_stMatrix ,
|
|
GLI_tdxValue xYAngle )
|
|
{
|
|
MTH3D_tdstVector stVectI,stVectJ,stVectK;
|
|
|
|
POS_fn_vGetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
|
|
MTH3D_M_vSetXofVector(&stVectI,GLI_M_Cos(xYAngle)) ;
|
|
MTH3D_M_vSetZofVector(&stVectI,GLI_M_Sin(xYAngle)) ;
|
|
MTH3D_M_vSetXofVector(&stVectK,GLI_M_Neg(GLI_M_Sin(xYAngle))) ;
|
|
MTH3D_M_vSetZofVector(&stVectK,GLI_M_Cos(xYAngle)) ;
|
|
|
|
POS_fn_vSetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
}
|
|
|
|
void fn_vRotateZ ( POS_tdstCompletePosition *p_stMatrix ,
|
|
GLI_tdxValue xZAngle )
|
|
{
|
|
MTH3D_tdstVector stVectI,stVectJ,stVectK;
|
|
|
|
POS_fn_vGetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
|
|
MTH3D_M_vSetXofVector(&stVectI,GLI_M_Cos(xZAngle));
|
|
MTH3D_M_vSetYofVector(&stVectI,GLI_M_Sin(xZAngle));
|
|
MTH3D_M_vSetXofVector(&stVectJ,GLI_M_Neg(GLI_M_Sin(xZAngle)));
|
|
MTH3D_M_vSetYofVector(&stVectJ,GLI_M_Cos(xZAngle));
|
|
|
|
POS_fn_vSetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
}
|
|
|
|
void DEV_MultiDevice3D::RotateObjectX()
|
|
{
|
|
POS_tdstCompletePosition p_stMatrix;
|
|
GLI_tdxValue xXAngle;
|
|
POS_fn_vSetIdentityMatrix(&p_stMatrix);
|
|
|
|
if (m_hSuperObjectWorld != NULL)
|
|
{
|
|
xXAngle = (GLI_tdxValue)0.1;
|
|
POS_fn_vSetIdentityMatrix(&p_stMatrix);
|
|
fn_vRotateX(&p_stMatrix, xXAngle);
|
|
POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld),
|
|
HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld),
|
|
&p_stMatrix);
|
|
POS_fn_vNormalizeMatrix(HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld));
|
|
}
|
|
}
|
|
|
|
void DEV_MultiDevice3D::RotateObjectY()
|
|
{
|
|
POS_tdstCompletePosition p_stMatrix;
|
|
GLI_tdxValue xYAngle;
|
|
POS_fn_vSetIdentityMatrix(&p_stMatrix);
|
|
|
|
if (m_hSuperObjectWorld != NULL)
|
|
{
|
|
xYAngle = (GLI_tdxValue)0.1;
|
|
POS_fn_vSetIdentityMatrix(&p_stMatrix);
|
|
fn_vRotateY(&p_stMatrix, xYAngle);
|
|
POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld),
|
|
HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld),
|
|
&p_stMatrix);
|
|
POS_fn_vNormalizeMatrix(HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld));
|
|
}
|
|
}
|
|
|
|
void DEV_MultiDevice3D::RotateObjectZ()
|
|
{
|
|
POS_tdstCompletePosition p_stMatrix;
|
|
GLI_tdxValue xZAngle;
|
|
POS_fn_vSetIdentityMatrix(&p_stMatrix);
|
|
|
|
if (m_hSuperObjectWorld != NULL)
|
|
{
|
|
xZAngle = (GLI_tdxValue)0.1;
|
|
POS_fn_vSetIdentityMatrix(&p_stMatrix);
|
|
fn_vRotateZ(&p_stMatrix, xZAngle);
|
|
POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld),
|
|
HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld),
|
|
&p_stMatrix);
|
|
POS_fn_vNormalizeMatrix(HIE_fn_hGetSuperObjectMatrix(m_hSuperObjectWorld));
|
|
}
|
|
}
|
|
|
|
void DEV_MultiDevice3D::RotateWorldX()
|
|
{
|
|
RotateObjectX();
|
|
}
|
|
|
|
void DEV_MultiDevice3D::RotateWorldY()
|
|
{
|
|
RotateObjectY();
|
|
}
|
|
|
|
void DEV_MultiDevice3D::RotateWorldZ()
|
|
{
|
|
RotateObjectZ();
|
|
}
|
|
|
|
#endif // ACTIVE_EDITOR
|