reman3/Rayman_X/cpa/tempgrp/ITF/devmul3d.cpp

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