560 lines
20 KiB
C++
560 lines
20 KiB
C++
// (c) Ubi Studios 1996
|
|
// See Vincent Greco for any comment or question
|
|
|
|
#include "stdafx.h"
|
|
|
|
#ifdef ACTIVE_EDITOR
|
|
#include "acp_base.h"
|
|
#include "geo.h"
|
|
#include "gli.h"
|
|
#include "col.h"
|
|
#define HieFriend
|
|
#include "spo.h"
|
|
#include "lst.hpp"
|
|
#include "incgam.h"
|
|
#undef HieFriend
|
|
|
|
#include "x:\cpa\tempgrp\gliGLOU\MULTIDRV\inc\visus_st.h"
|
|
|
|
#include "itf/CPASObjB.hpp"
|
|
//temporary 3DOS header file include
|
|
//#include "x:appli\3dos\inc\3dos\physicol.h"
|
|
#include "pcs.h"
|
|
#include "po.h"
|
|
#include "ipo.h"
|
|
#include "isi.h"
|
|
|
|
DeclareTemplateStatic(HIE_tdxHandleToSuperObject);
|
|
|
|
ACP_tdxHandleOfMaterial g_hMaterial;
|
|
BOOL g_bMaterialInitialised = FALSE;
|
|
extern ACP_tdxBool g_bShowCollisionMap;
|
|
|
|
|
|
GLI_tdstColor TabColor[]=
|
|
{
|
|
{(float) 0.00, (float) 0.00, (float) 0.00, (float) 0.0},//E_lc_NoColor
|
|
{(float) 0.8f, (float) 0.0f, (float) 0.0f, (float) 1.f},//E_lc_Red
|
|
{(float) 0.00, (float) 0.99, (float) 0.00, (float) 0.0},//E_lc_Green
|
|
{(float) 0.00, (float) 0.00, (float) 0.99, (float) 0.0},//E_lc_Blue
|
|
{(float) 0.45, (float) 0.45, (float) 0.00, (float) 0.0},//E_lc_Yellow
|
|
{(float) 0.45, (float) 0.00, (float) 0.99, (float) 0.0},//E_lc_Violet
|
|
{(float) 0.00, (float) 0.45, (float) 0.99, (float) 0.0},//E_lc_LightBlue
|
|
};
|
|
|
|
#define C_lLocalColorMask ( GLI_C_lAllIsEnable \
|
|
- GLI_C_lIsNotForceDefaultMaterial \
|
|
- GLI_C_lIsNotGrided \
|
|
- GLI_C_lIsUseStaticLights \
|
|
- GLI_C_lIsUseRLI)
|
|
|
|
|
|
//########################################################################################
|
|
//########################################################################################
|
|
//########################################################################################
|
|
CPA_SuperObjectBase::CPA_SuperObjectBase (void)
|
|
: CPA_EdNode<CPA_SuperObjectBase,HIE_tdxHandleToSuperObject,HIE_tdxHandleToSuperObject>()
|
|
{
|
|
m_eDrawingFlag = E_df_Normal;
|
|
m_eColor = E_lc_NoColor;
|
|
m_bMustDraw = TRUE;
|
|
m_bDrawBV = FALSE;
|
|
}
|
|
|
|
|
|
//########################################################################################
|
|
//########################################################################################
|
|
//########################################################################################
|
|
CPA_SuperObjectBase::CPA_SuperObjectBase(HIE_tdxHandleToSuperObject hEngineSO)
|
|
{
|
|
SetStruct(hEngineSO);
|
|
m_eDrawingFlag = E_df_Normal;
|
|
m_eColor = E_lc_NoColor;
|
|
m_bMustDraw = TRUE;
|
|
m_bDrawBV = FALSE;
|
|
}
|
|
|
|
|
|
//ANNECY TQ 26/02/98{
|
|
//########################################################################################
|
|
//########################################################################################
|
|
//########################################################################################
|
|
//--------------------------------------------------------------------------------------
|
|
// Name : CreateParallelBoxGeometricObject
|
|
// Author : Thierry QUERE
|
|
// Date : 27/02/98
|
|
// Description : Creates an engine-geometric object to store the parallel box (bounding volume)
|
|
// and to send it to the viewport
|
|
//--------------------------------------------------------------------------------------
|
|
void CPA_SuperObjectBase::CreateParallelBoxGeometricObject()
|
|
{
|
|
ACP_tdxHandleOfElement hAlignedBoxes;
|
|
|
|
GEO_vCreateGeometricObject(&s_hBoxGeomObj, 2 /* 2 points */, 1 /* 1 element */);
|
|
GEO_vCreateElementAlignedBoxes(s_hBoxGeomObj, &hAlignedBoxes, 1);
|
|
|
|
}
|
|
|
|
void CPA_SuperObjectBase::DestroyParallelBoxGeometricObject()
|
|
{
|
|
|
|
GEO_vDeleteGeometricObject(&s_hBoxGeomObj);
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
// Name : CreateBoundingSphereGeometricObject
|
|
// Author : Thierry QUERE
|
|
// Date : 03/06/98
|
|
// Description : Creates an engine-geometric object to store the BoundingSphere (bounding volume)
|
|
// and to send it to the viewport
|
|
//--------------------------------------------------------------------------------------
|
|
void CPA_SuperObjectBase::CreateBoundingSphereGeometricObject()
|
|
{
|
|
ACP_tdxHandleOfElement hSphere;
|
|
|
|
GEO_vCreateGeometricObject(&s_hSphereGeomObj, 1 /* 1 point */, 1 /* 1 element */);
|
|
GEO_vCreateElementSpheres(s_hSphereGeomObj, &hSphere, 1);
|
|
|
|
}
|
|
|
|
void CPA_SuperObjectBase::DestroyBoundingSphereGeometricObject()
|
|
{
|
|
|
|
GEO_vDeleteGeometricObject(&s_hSphereGeomObj);
|
|
}
|
|
|
|
|
|
//ENDANNECY TQ}
|
|
|
|
|
|
//########################################################################################
|
|
//########################################################################################
|
|
//########################################################################################
|
|
|
|
void CPA_SuperObjectBase::Display(GLD_tdxHandleToViewportAttributes hVpt,long lDrawMask,
|
|
tdstSaveLight a_tdxhArrayOfLights[], long lNbLights,
|
|
HIE_tdxHandleToSuperObject pWorld, BOOL bUseLocalFlag)
|
|
{
|
|
HIE_tdxHandleToSuperObject pStruct;
|
|
ACP_tdxHandleToRadiosity hRad;
|
|
GEO_tdxHandleToBoundingSphere hBoundingSphere = NULL;
|
|
GEO_tdxHandleToParallelBox hParallelBox = NULL;
|
|
ACP_tdxHandleOfObject hBoundingVolume = NULL;
|
|
HIE_tdxHandleToVoid hObject;
|
|
CPA_SuperObjectBase * pChild;
|
|
MTH3D_tdstVector stCenter;
|
|
tdeLocalColor eCol;
|
|
POSITION pos;
|
|
long lLocalMask;
|
|
unsigned long ulType;
|
|
long lMask;
|
|
long lIndex;
|
|
MTH3D_tdstVector stMaxBoxPoint;
|
|
MTH3D_tdstVector stMinBoxPoint;
|
|
POS_tdstCompletePosition * p_stGlobalMatrix;
|
|
POS_tdstCompletePosition stIdentityMatrix;
|
|
float fGlobalAlphaTemp ;
|
|
float fTransp, fTransparency = -1.0;
|
|
ACP_tdxBool bDummy;
|
|
|
|
// draw only valid objects
|
|
if (!m_bMustDraw)
|
|
return;
|
|
|
|
if (!g_bMaterialInitialised)
|
|
{
|
|
GLI_xCreateMaterial(&g_hMaterial);
|
|
GLI_xSetMaterialType(g_hMaterial, C_lGouraudElement);
|
|
g_bMaterialInitialised = TRUE;
|
|
}
|
|
// init parameters
|
|
pStruct = (HIE_tdxHandleToSuperObject) GetSuperObjectStruct();
|
|
eCol = GetLocalColor();
|
|
|
|
// init matrix
|
|
HIE_fn_vPushMatrix (pStruct);
|
|
HIE_fn_vPushOnCameraMatrixStack (pStruct);
|
|
|
|
// selection drawing : no light !
|
|
if (eCol != E_lc_NoColor)
|
|
{
|
|
for (lIndex = 0; lIndex < lNbLights; lIndex++)
|
|
GLI_xSetLightState(a_tdxhArrayOfLights[lIndex].hLight, 0);
|
|
}
|
|
|
|
// local mask
|
|
lLocalMask = (eCol == E_lc_NoColor) ? lDrawMask : lDrawMask & C_lLocalColorMask ;
|
|
//ANNECY VL PRT 08/04/98{
|
|
// avoid sinus effect while in editor mode
|
|
lLocalMask |= GLI_C_lHasNotSinusEffect;
|
|
//ENDANNECY VL}
|
|
// default material
|
|
GLI_xSetMaterialAmbientCoef (g_hMaterial, TabColor+eCol);
|
|
GLI_vSetDefaultMaterial(hVpt, g_hMaterial);
|
|
|
|
// local drawing flag
|
|
if (bUseLocalFlag)
|
|
{
|
|
switch (m_eDrawingFlag)
|
|
{
|
|
case E_df_BoundingV:
|
|
lLocalMask &= ~GLI_C_lIsNotDrawingSuperObjectBoundingVolume;
|
|
break;
|
|
case E_df_Grided:
|
|
lLocalMask &= ~GLI_C_lIsNotGrided;
|
|
break;
|
|
case E_df_Wired:
|
|
lLocalMask &= ~GLI_C_lIsNotWired;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (m_bDrawBV)
|
|
lLocalMask &= ~GLI_C_lIsNotDrawingSuperObjectBoundingVolume;
|
|
|
|
fTransp = HIE_fn_fGetSuperObjectTransparenceLevel(pStruct);
|
|
|
|
if (( eCol != E_lc_NoColor) ||
|
|
((fTransp < 30.0) && (fTransp > 0.0)) ||
|
|
( bUseLocalFlag && (m_eDrawingFlag == E_df_Grided)) ||
|
|
!(HIE_fn_lGetSuperObjectDrawMask(pWorld) & GLI_C_lIsNotGrided))
|
|
{
|
|
fTransparency = fTransp;
|
|
|
|
// minimal transparency
|
|
if (fTransparency < 30.0 && fTransparency > 0.0)
|
|
HIE_fn_vSetSuperObjectTransparenceLevel(pStruct, 30.0);
|
|
|
|
if (eCol == E_lc_NoColor)
|
|
{
|
|
if (fTransparency > 200.0)
|
|
HIE_fn_vSetSuperObjectTransparenceLevel(pStruct, (float) (fTransparency - 100.0));
|
|
else if (fTransparency > 100.0)
|
|
HIE_fn_vSetSuperObjectTransparenceLevel(pStruct, 100.0);
|
|
}
|
|
else
|
|
HIE_fn_vSetSuperObjectTransparenceLevel(pStruct, 128.0);
|
|
}
|
|
|
|
|
|
// parameters
|
|
ulType = HIE_fn_ulGetSuperObjectType(pStruct);
|
|
lMask = HIE_fn_lGetSuperObjectDrawMask(pStruct);
|
|
// avoid sinus effect while in editor mode
|
|
lMask |= GLI_C_lHasNotSinusEffect;
|
|
hObject = HIE_fn_hGetSuperObjectObject(pStruct);
|
|
|
|
// bounding volume
|
|
hParallelBox = (GEO_tdxHandleToParallelBox)HIE_fn_hGetSuperObjectBoundingVolume(pStruct);
|
|
if (hParallelBox && HIE_fn_SO_bHasABoxBoundingVolume (pStruct))
|
|
{
|
|
p_stGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pStruct);
|
|
MTH3D_M_vAddVector(&stMaxBoxPoint, &p_stGlobalMatrix->stTranslationVector, GEO_fn_pGetMaxPointOfParallelBox(hParallelBox));
|
|
MTH3D_M_vAddVector(&stMinBoxPoint, &p_stGlobalMatrix->stTranslationVector, GEO_fn_pGetMinPointOfParallelBox(hParallelBox));
|
|
GEO_vSetPointOfObject (s_hBoxGeomObj,
|
|
&stMaxBoxPoint,
|
|
1);
|
|
GEO_vSetPointOfObject (s_hBoxGeomObj,
|
|
&stMinBoxPoint,
|
|
0);
|
|
GEO_vSetMinMaxPointOfIndexedAlignedBox( s_hBoxGeomObj,
|
|
0, /* First element */
|
|
0, /* First Aligned box of the element */
|
|
0, /* First point = Max */
|
|
1);/* Second point = Min */
|
|
hBoundingVolume = s_hBoxGeomObj;
|
|
}
|
|
else
|
|
{
|
|
hBoundingSphere = (GEO_tdxHandleToBoundingSphere)HIE_fn_hGetSuperObjectBoundingVolume(pStruct);
|
|
if ((hBoundingSphere) && (!HIE_fn_SO_bHasABoxBoundingVolume(pStruct)))
|
|
{
|
|
MTH3D_M_vCopyVector(&stCenter, GEO_fn_pGetCenterPointOfBoundingSphere(hBoundingSphere));
|
|
|
|
GEO_vSetPointOfObject( s_hSphereGeomObj,
|
|
GEO_fn_pGetCenterPointOfBoundingSphere(hBoundingSphere),
|
|
0);
|
|
|
|
GEO_vSetCenterPointOfIndexedSphere ( s_hSphereGeomObj,
|
|
0, /* First Element */
|
|
0, /* First Sphere of the element */
|
|
0); /* First Point */
|
|
|
|
GEO_vSetRadiusOfIndexedSphere ( s_hSphereGeomObj,
|
|
0, /* First Element */
|
|
0, /* First Sphere of the element */
|
|
GEO_fn_xGetRadiusOfBoundingSphere(hBoundingSphere)
|
|
);
|
|
|
|
hBoundingVolume = s_hSphereGeomObj;
|
|
}
|
|
}
|
|
|
|
|
|
// draw geometric object
|
|
if (ulType & (HIE_C_ulEDT_Geometric | HIE_C_ulSpecialEffect))
|
|
{
|
|
POS_tdstCompletePosition *p_stCurrentMatrix;
|
|
|
|
if((MTH_M_bEqual(GEO_xGetElementType((ACP_tdxHandleOfObject)hObject, 0), GEO_C_xElementAlignedBoxes)) && (fn_bHasALinkedZDM() == TRUE))
|
|
{
|
|
|
|
/* The points have not the translation of the object ... */
|
|
MTH3D_M_vAddVector(&((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[0], &pStruct->hGlobalMatrix->stTranslationVector, &((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[0]);
|
|
MTH3D_M_vAddVector(&((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[1], &pStruct->hGlobalMatrix->stTranslationVector, &((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[1]);
|
|
|
|
POS_fn_vSetIdentityMatrix(&stIdentityMatrix);
|
|
HIE_fn_bLoadMatrix (&stIdentityMatrix);
|
|
// update camera matrix
|
|
p_stCurrentMatrix = HIE_fn_pGetCurrentInCamCoordsMatrix();
|
|
HIE_fn_vSetCurrentInCamCoordsMatrix(&((( GLI_tdstSpecificAttributesFor3D *)hVpt->p_vSpecificToXD)->p_stCam)->stMatrix);
|
|
}
|
|
fGlobalAlphaTemp = GLI_vGetGlobalAlpha();
|
|
GLI_vSetGlobalAlpha( HIE_fn_fGetSuperObjectTransparenceLevel(pStruct) );
|
|
GLI_xSendObjectToViewportWithLights(hVpt, (ACP_tdxHandleOfObject)hObject, lMask&lLocalMask);
|
|
if (eCol != E_lc_NoColor)
|
|
GLI_xSendObjectToViewportWithLights(hVpt, (ACP_tdxHandleOfObject)hObject, (lMask&lLocalMask) - GLI_C_lIsNotWired);
|
|
GLI_vSetGlobalAlpha (fGlobalAlphaTemp) ;
|
|
// Please, do not alter the following line without contacting Thierry QUERE // Annecy
|
|
if((MTH_M_bEqual(GEO_xGetElementType((ACP_tdxHandleOfObject)hObject, 0), GEO_C_xElementAlignedBoxes)) && (fn_bHasALinkedZDM() == TRUE))
|
|
{
|
|
HIE_fn_vPopMatrix ();
|
|
// update camera matrix
|
|
HIE_fn_vSetCurrentInCamCoordsMatrix(p_stCurrentMatrix);
|
|
//HIE_fn_vPopOnCameraMatrixStack ();
|
|
MTH3D_M_vSubVector(&((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[0], &((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[0], &pStruct->hGlobalMatrix->stTranslationVector);
|
|
MTH3D_M_vSubVector(&((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[1], &((ACP_tdxHandleOfObject)hObject)->d_stListOfPoints[1], &pStruct->hGlobalMatrix->stTranslationVector);
|
|
}
|
|
}
|
|
|
|
// draw physical object
|
|
if ((ulType == HIE_C_ulPO) || (ulType == HIE_C_ulPO_Mirror))
|
|
{
|
|
PO_tdxHandleToPhysicalObject hPO = (PO_tdxHandleToPhysicalObject) hObject;
|
|
|
|
// get bounding volume and center
|
|
if (!HIE_fn_SO_bHasABoxBoundingVolume (pStruct))
|
|
hBoundingSphere = PO_fn_hGetBoundingVolume(hPO);
|
|
|
|
if ((hBoundingSphere) && (!HIE_fn_SO_bHasABoxBoundingVolume(pStruct)))
|
|
{
|
|
MTH3D_M_vCopyVector(&stCenter, GEO_fn_pGetCenterPointOfBoundingSphere(hBoundingSphere));
|
|
|
|
GEO_vSetPointOfObject( s_hSphereGeomObj,
|
|
GEO_fn_pGetCenterPointOfBoundingSphere(hBoundingSphere),
|
|
0);
|
|
|
|
GEO_vSetCenterPointOfIndexedSphere ( s_hSphereGeomObj,
|
|
0, /* First Element */
|
|
0, /* First Sphere of the element */
|
|
0); /* First Point */
|
|
|
|
GEO_vSetRadiusOfIndexedSphere ( s_hSphereGeomObj,
|
|
0, /* First Element */
|
|
0, /* First Sphere of the element */
|
|
GEO_fn_xGetRadiusOfBoundingSphere(hBoundingSphere)
|
|
);
|
|
|
|
hBoundingVolume = s_hSphereGeomObj;
|
|
}
|
|
else if ((!hBoundingSphere) && (!HIE_fn_SO_bHasABoxBoundingVolume(pStruct)))
|
|
MTH3D_M_vNullVector(&stCenter);
|
|
|
|
fGlobalAlphaTemp = GLI_vGetGlobalAlpha();
|
|
GLI_vSetGlobalAlpha( HIE_fn_fGetSuperObjectTransparenceLevel(pStruct) );
|
|
//--- Display collision map ---
|
|
if(g_bShowCollisionMap)
|
|
{
|
|
if(PO_fn_hGetCollideSet(hPO))
|
|
{
|
|
if(PCS_fn_hGetZdrGeoObjOfPhysicalCollSet(PO_fn_hGetCollideSet(hPO)))
|
|
GLI_xSendObjectToViewportWithLights(hVpt, PCS_fn_hGetZdrGeoObjOfPhysicalCollSet(PO_fn_hGetCollideSet(hPO)), lMask&lLocalMask);
|
|
}
|
|
}
|
|
else
|
|
//--- Display graphical map ---
|
|
{
|
|
GLI_lSendVisualSetToViewport2(hVpt, PO_fn_hGetVisualSet(hPO), &stCenter, lMask&lLocalMask);
|
|
if (eCol != E_lc_NoColor)
|
|
GLI_lSendVisualSetToViewport2(hVpt, PO_fn_hGetVisualSet(hPO), &stCenter, (lMask&lLocalMask) - GLI_C_lIsNotWired);
|
|
GLI_vSetGlobalAlpha (fGlobalAlphaTemp) ;
|
|
}
|
|
|
|
}
|
|
|
|
// draw instanciated physical object
|
|
if (ulType & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror))
|
|
{
|
|
IPO_tdxHandleToInstanciatedPhysicalObject hIPO = (IPO_tdxHandleToInstanciatedPhysicalObject) hObject;
|
|
PO_tdxHandleToPhysicalObject hPO = IPO_fn_hGetPhysicalObject(hIPO);
|
|
|
|
// get bounding volume and center
|
|
if (!HIE_fn_SO_bHasABoxBoundingVolume (pStruct))
|
|
hBoundingSphere = PO_fn_hGetBoundingVolume(hPO);
|
|
|
|
//ANNECY TQ 27/02/98{
|
|
if ((hBoundingSphere) && (!HIE_fn_SO_bHasABoxBoundingVolume(pStruct)))
|
|
{
|
|
MTH3D_M_vCopyVector(&stCenter, GEO_fn_pGetCenterPointOfBoundingSphere(hBoundingSphere));
|
|
|
|
GEO_vSetPointOfObject( s_hSphereGeomObj,
|
|
GEO_fn_pGetCenterPointOfBoundingSphere(hBoundingSphere),
|
|
0);
|
|
|
|
GEO_vSetCenterPointOfIndexedSphere ( s_hSphereGeomObj,
|
|
0, /* First Element */
|
|
0, /* First Sphere of the element */
|
|
0); /* First Point */
|
|
|
|
GEO_vSetRadiusOfIndexedSphere ( s_hSphereGeomObj,
|
|
0, /* First Element */
|
|
0, /* First Sphere of the element */
|
|
GEO_fn_xGetRadiusOfBoundingSphere(hBoundingSphere)
|
|
);
|
|
|
|
hBoundingVolume = s_hSphereGeomObj;
|
|
}
|
|
else if (HIE_fn_SO_bHasABoxBoundingVolume(pStruct))
|
|
{
|
|
MTH3D_tdstVector * p_stMinPoint = GEO_fn_pGetMinPointOfParallelBox ((GEO_tdstParallelBox *) HIE_fn_hGetSuperObjectBoundingVolume (pStruct));
|
|
MTH3D_tdstVector * p_stMaxPoint = GEO_fn_pGetMaxPointOfParallelBox ((GEO_tdstParallelBox *) HIE_fn_hGetSuperObjectBoundingVolume (pStruct));
|
|
|
|
MTH3D_M_vMiddleVector (&stCenter , p_stMinPoint , p_stMaxPoint);
|
|
}
|
|
//ENDANNECY TQ}
|
|
|
|
fGlobalAlphaTemp = GLI_vGetGlobalAlpha();
|
|
GLI_vSetGlobalAlpha( HIE_fn_fGetSuperObjectTransparenceLevel(pStruct) );
|
|
// get RLI parameters
|
|
hRad = IPO_fn_hGetRadiosity(hIPO);
|
|
//--- Display Collision Map ---
|
|
if(g_bShowCollisionMap)
|
|
{
|
|
if(PO_fn_hGetCollideSet(hPO))
|
|
{
|
|
if(PCS_fn_hGetZdrGeoObjOfPhysicalCollSet(PO_fn_hGetCollideSet(hPO)))
|
|
GLI_xSendObjectToViewportWithLights(hVpt, PCS_fn_hGetZdrGeoObjOfPhysicalCollSet(PO_fn_hGetCollideSet(hPO)), lMask&lLocalMask);
|
|
}
|
|
}
|
|
else
|
|
//--- Display Graphical Map ---
|
|
{
|
|
GLI_lSendVisualSetToViewportWithRLI2(hVpt, PO_fn_hGetVisualSet(hPO), &stCenter, lMask&lLocalMask, hRad/*dColor*/);
|
|
if (eCol != E_lc_NoColor)
|
|
GLI_lSendVisualSetToViewportWithRLI2(hVpt, PO_fn_hGetVisualSet(hPO), &stCenter, (lMask&lLocalMask) - GLI_C_lIsNotWired, hRad /*dColor*/);
|
|
}
|
|
}
|
|
GLI_vSetGlobalAlpha (fGlobalAlphaTemp) ;
|
|
|
|
/* The matrix that is on the top of the pile is currently the global matrix of the object */
|
|
/* This matrix is used by the viewport to know in what axis system the coordinates he receives
|
|
are */
|
|
/* When the bounding volume is a sphere, the matrix on the top MUST be the gobal matrix because
|
|
the center and the radius are computed in the local axis system of the object, */
|
|
/* but, unfortunatly, for the parallel boxes where everything is computed in the global
|
|
axis system, the matrix on the top must be the identity matrix */
|
|
|
|
// draw bounding volume
|
|
if (hBoundingVolume &&
|
|
(HIE_fn_SO_bHasABoxBoundingVolume(pStruct)) &&
|
|
!(lLocalMask & GLI_C_lIsNotDrawingSuperObjectBoundingVolume))
|
|
{
|
|
POS_tdstCompletePosition *p_stCurrentMatrix;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stIdentityMatrix);
|
|
HIE_fn_bLoadMatrix (&stIdentityMatrix);
|
|
// update camera matrix
|
|
p_stCurrentMatrix = HIE_fn_pGetCurrentInCamCoordsMatrix();
|
|
HIE_fn_vSetCurrentInCamCoordsMatrix(&((( GLI_tdstSpecificAttributesFor3D *)hVpt->p_vSpecificToXD)->p_stCam)->stMatrix);
|
|
|
|
GLI_xSendObjectToViewportWithLights(hVpt, hBoundingVolume, lMask & lDrawMask &~GLI_C_lIsNotWired &~GLI_C_lIsNotDrawCollideInformation);
|
|
|
|
HIE_fn_vPopMatrix ();
|
|
// update camera matrix
|
|
HIE_fn_vSetCurrentInCamCoordsMatrix(p_stCurrentMatrix);
|
|
//HIE_fn_vPopOnCameraMatrixStack();
|
|
}
|
|
else
|
|
if(hBoundingVolume&&!(lLocalMask &GLI_C_lIsNotDrawingSuperObjectBoundingVolume))
|
|
GLI_xSendObjectToViewportWithLights(hVpt, hBoundingVolume, lMask & lDrawMask &~GLI_C_lIsNotWired &~GLI_C_lIsNotDrawCollideInformation);
|
|
|
|
|
|
// reset lights
|
|
if (eCol != E_lc_NoColor)
|
|
{
|
|
for (lIndex = 0; lIndex < lNbLights; lIndex++)
|
|
GLI_xSetLightState(a_tdxhArrayOfLights[lIndex].hLight, a_tdxhArrayOfLights[lIndex].lInitialState);
|
|
}
|
|
|
|
if (fTransparency >= 0.0)
|
|
{
|
|
HIE_fn_vSetSuperObjectTransparenceLevel(pStruct, fTransparency);
|
|
}
|
|
|
|
// recursive function
|
|
if (HIE_fn_ulGetSuperObjectType(pStruct)==HIE_C_ulActor)
|
|
{
|
|
GLI_tdxHandleToLight hLight=HIE_fn_hGetSuperObjectLight(pStruct);
|
|
|
|
if(hLight) {
|
|
if (HIE_fn_bGetSuperObjectExcluLight(pStruct))
|
|
GLI_xSetViewportLightsOnOff(0);
|
|
GLI_vAddLightToViewport(hVpt,hLight);
|
|
}
|
|
bDummy = g_bShowCollisionMap;
|
|
g_bShowCollisionMap = FALSE;
|
|
M_ForAllTheElementsInList(pChild, this, pos)
|
|
pChild->Display(hVpt, HIE_fn_lGetSuperObjectDrawMask(pStruct),
|
|
a_tdxhArrayOfLights, lNbLights, pWorld, bUseLocalFlag);
|
|
g_bShowCollisionMap = bDummy;
|
|
if(hLight) {
|
|
GLI_vPopLightsInViewport(hVpt , 1);
|
|
if (HIE_fn_bGetSuperObjectExcluLight(pStruct))
|
|
GLI_xSetViewportLightsOnOff(1);
|
|
}
|
|
}
|
|
else
|
|
M_ForAllTheElementsInList(pChild, this, pos)
|
|
pChild->Display(hVpt, HIE_fn_lGetSuperObjectDrawMask(pStruct)&lDrawMask,
|
|
a_tdxhArrayOfLights, lNbLights, pWorld, bUseLocalFlag);
|
|
|
|
|
|
HIE_fn_vPopMatrix ();
|
|
HIE_fn_vPopOnCameraMatrixStack ();
|
|
}
|
|
|
|
//########################################################################################
|
|
//########################################################################################
|
|
//########################################################################################
|
|
void CPA_SuperObjectBase::DisplayWorld(GLD_tdxHandleToViewportAttributes hVpt, tdstSaveLight a_tdxhArrayOfLights[], long lNbLights, BOOL bUseLocalMask)
|
|
{
|
|
GEO_tdstColor stColor;
|
|
|
|
// default material
|
|
GLI_xCreateMaterial(&g_hMaterial);
|
|
stColor.xR = (float) 0.99;
|
|
stColor.xG = (float) 0.99;
|
|
stColor.xB = (float) 0.99;
|
|
GLI_xSetMaterialAmbientCoef (g_hMaterial, &stColor);
|
|
GLI_xSetMaterialType(g_hMaterial, C_lGouraudElement);
|
|
GLI_vSetDefaultMaterial(hVpt, g_hMaterial);
|
|
// reinit matrix
|
|
HIE_fn_vInitMatrixStack();
|
|
if( HIE_fn_bInitCameraMatrixStack(hVpt) == OK)
|
|
{
|
|
// display world (recursive function)
|
|
Display(hVpt, GLI_C_lAllIsEnable&(GLI_C_lIsNotDrawCollideInformation^0xffffffff),
|
|
a_tdxhArrayOfLights, lNbLights,
|
|
(HIE_tdxHandleToSuperObject) GetSuperObjectStruct(), bUseLocalMask);
|
|
}
|
|
}
|
|
|
|
// FBF 01 04 98 {
|
|
void CPA_SuperObjectBase::SetLocalColor (tdeLocalColor eNewColor)
|
|
{
|
|
m_eColor = eNewColor;
|
|
}
|
|
// FBF 01 04 98}
|
|
|
|
|
|
#endif // ACTIVE_EDITOR
|