reman3/Rayman_X/cpa/tempgrp/MOR/specif/dupobjmp.c

214 lines
11 KiB
C

/**********************************************************
* *
* Morphing *
* *
* This file contains the function to deal with *
* geometric and physical objects *
* *
* Author : Ubi China - Alexis Vaisse *
* *
**********************************************************/
//XB
#define D_3dData_StructureDefine
#define D_ObjsTbls_Define
#define PO_FRIEND
#include "ACP_base.h"
#include "GAM/ToolsCPA.h"
#include "gam.h"
#include "GMT.h"
#include "GEO.h"
#include "GLI.h"
#include "PCS.h"
#include "COL.h"
#include "PO.h"
#define HieFriend
#include "SPO.h"
#include "mec.h"
#include "prt.h"
#include "fil.h"
#include "snd.h"
//#include "fon.h"
#include "ipt.h"
#define ENV_FRIEND
//#include "env.h"
//#include "srf.h"
#include "sct.h"
// ANNECY - MT 08/05/98 {
#include "TMP.h"
// END ANNECY MT }
#include "x:/cpa/tempgrp/gliglou/multidrv/inc/visus_st.h"
#include "mor.h"
/* Macro */
// ANNECY - MT 08/05/98 {
#define GEO_M_DuplicateElement( Elem ) \
MMG_fn_vAddMemoryInfo (MMG_C_lTypeMOR , MMG_C_lSubTypeElement , 0); \
MOR_M_pvMalloc (hObject2 -> d_stListOfElements [hElement] , void * , sizeof( Elem ) ); \
if (hObject2 -> d_stListOfElements [hElement] == NULL) return(NULL); \
hObject2 -> d_xListOfElementsTypes [hElement] = hObject1 -> d_xListOfElementsTypes [hElement]; \
memcpy (hObject2 -> d_stListOfElements [hElement] , hObject1 -> d_stListOfElements [hElement] , sizeof (Elem));
// END ANNECY MT }
/*====================================================================================
Name: MOR_fn_xCopyGeometricObjectForMorph
Goal: Make a copy of an existing geometric object. This copy will be used as morphed object
Code: Qi Zeyu
=====================================================================================*/
ACP_tdxHandleOfObject MOR_fn_xCopyGeometricObjectForMorph (GEO_tdstGeometricObject * hObject1)
{
ACP_tdxIndex xNbPoints;
ACP_tdxIndex xNbElements;
ACP_tdxHandleOfObject hObject2;
ACP_tdxHandleOfElement hElement;
xNbPoints = hObject1 -> xNbPoints;
xNbElements = hObject1 -> xNbElements;
// ANNECY - MT 08/05/98 {
GEO_vCreateTMPGeometricObject (& hObject2 , xNbPoints , xNbElements);
// END ANNECY MT }
if (hObject2 == NULL) return hObject2;
// copy the list of the points.
memcpy(hObject2->d_stListOfPoints, hObject1->d_stListOfPoints, sizeof(MTH3D_tdstVector)*xNbPoints);
// copy the list of the normals.
memcpy(hObject2->d_stListOfPointsNormals, hObject1->d_stListOfPointsNormals, sizeof(MTH3D_tdstVector)*xNbPoints);
// copy the list of element types
memcpy(hObject2->d_xListOfElementsTypes, hObject1->d_xListOfElementsTypes, sizeof(ACP_tdxIndex)* xNbElements);
// copy the elements
for(hElement=0 ; hElement<xNbElements ; hElement++)
{
switch (hObject1 -> d_xListOfElementsTypes [hElement])
{
case GEO_C_xElementNULL: break;
case GEO_C_xElementPoints: GEO_M_DuplicateElement( GEO_tdstElementPoints ) ; break;
case GEO_C_xElementLines: GEO_M_DuplicateElement( GEO_tdstElementLines ) ; break;
case GEO_C_xElementFaceMapDescriptors : GEO_M_DuplicateElement( GEO_tdstElementFaceMapDescriptors); break;
case GEO_C_xElementSprites: GEO_M_DuplicateElement( GEO_tdstElementSprite ) ; break;
case GEO_C_xElementSpheres: GEO_M_DuplicateElement( GEO_tdstElementSpheres ) ; break;
case GEO_C_xElementAlignedBoxes: GEO_M_DuplicateElement( GEO_tdstElementAlignedBoxes ) ; break;
case GEO_C_xElementCones: GEO_M_DuplicateElement( GEO_tdstIndexedCone ) ; break;
case GEO_C_xElementTMeshes: GEO_M_DuplicateElement( GEO_tdstElementTMeshes ) ; break;
case GEO_C_xElementIndexedTriangles : GEO_M_DuplicateElement( GEO_tdstElementIndexedTriangles ) ; break;
}
}
return hObject2;
}
/*====================================================================================
Name: MOR_fn_vDeleteGeometricObject
Goal: Delete a geometric object
=====================================================================================*/
void MOR_fn_vDeleteGeometricObject (ACP_tdxHandleOfObject *p_hObj )
{
long lElementCounter;
GEO_tdstGeometricObject * p_hObject ;
p_hObject= *(GEO_tdstGeometricObject **)p_hObj ;
for (lElementCounter = 0 ; lElementCounter < p_hObject -> xNbElements; lElementCounter ++ )
switch (p_hObject -> d_xListOfElementsTypes [lElementCounter ] )
{
// ANNECY - MT 08/05/98 {
case GEO_C_xElementNULL:
break;
case GEO_C_xElementPoints:
//MOR_M_Free( ((GEO_tdstElementPoints * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_xListOfPointIndex);
MOR_M_Free( p_hObject -> d_stListOfElements[lElementCounter ] );
break;
case GEO_C_xElementLines:
//MOR_M_Free( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfLineIndex);
//MOR_M_Free( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_hListOfLinesMaterial);
//MOR_M_Free( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfLinesReceivedLightIntensity);
MOR_M_Free( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
case GEO_C_xElementFaceMapDescriptors :
//MOR_M_Free( ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesNormals);
//MOR_M_Free( ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesReceivedLightIntensity);
//MOR_M_Free( ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesQuadrupled);
MOR_M_Free( ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
case GEO_C_xElementSprites:
//MOR_M_Free( ((GEO_tdstElementSprite * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfSprites);
MOR_M_Free( ((GEO_tdstElementSprite * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
case GEO_C_xElementSpheres:
//MOR_M_Free( ((GEO_tdstElementSpheres * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfSpheres );
MOR_M_Free( ((GEO_tdstElementSpheres * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
case GEO_C_xElementAlignedBoxes:
//MOR_M_Free( ((GEO_tdstElementAlignedBoxes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfAlignedBoxes);
MOR_M_Free( ((GEO_tdstElementAlignedBoxes * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
case GEO_C_xElementCones:
//MOR_M_Free( ((GEO_tdstElementCones * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfCones);
MOR_M_Free( ((GEO_tdstElementCones * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
case GEO_C_xElementTMeshes:
//MOR_M_Free( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfMeshAtoms);
//MOR_M_Free( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesNormals);
//MOR_M_Free( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesReceivedLightIntensity);
//MOR_M_Free( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfElementUV);
MOR_M_Free( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
case GEO_C_xElementIndexedTriangles :
//MOR_M_Free( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesTripled);
//MOR_M_Free( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesTripledIndexUV);
//MOR_M_Free( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesNormals);
//MOR_M_Free( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesReceivedLightIntensity);
//MOR_M_Free( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfElementUV);
MOR_M_Free( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
break;
}
MOR_M_Free( p_hObject -> d_stListOfPoints);
MOR_M_Free( p_hObject -> d_stListOfPointsNormals);
// if (p_hObject -> d_stListOfPointsReceivedLightIntensity != NULL)
// MOR_M_Free( p_hObject -> d_stListOfPointsReceivedLightIntensity);
// MOR_M_Free( p_hObject -> d_hListOfPointsMaterial);
// MOR_M_Free( p_hObject -> d_stListOfEdges);
// MOR_M_Free( p_hObject -> d_hListOfEdgesMaterial);
MOR_M_Free( p_hObject -> d_xListOfElementsTypes);
MOR_M_Free( p_hObject -> d_stListOfElements);
MOR_M_Free( p_hObject );
* p_hObj = NULL;
// END ANNECY MT }
}
/*====================================================================================
Name: MOR_fn_vDeletePhysicalObject
Goal: Delete a physical object
=====================================================================================*/
void MOR_fn_vDeletePhysicalObject (PO_tdstPhysicalObject * _pPhysicalObject)
{
ACP_tdxIndex i;
for(i=0 ; i<_pPhysicalObject->_hVisualSet->xNbLodDefinitions ; i++)
{
MOR_fn_vDeleteGeometricObject (& (_pPhysicalObject->_hVisualSet->d_p_stLodDefinitions [i]));
};
// ANNECY - MT 08/05/98 {
GEO_M_TMPFree(_pPhysicalObject->_hVisualSet->d_xThresholdsTable);
GEO_M_TMPFree(_pPhysicalObject->_hVisualSet->d_p_stLodDefinitions);
GEO_M_TMPFree(_pPhysicalObject->_hVisualSet);
MOR_M_Free(_pPhysicalObject);
// END ANNECY MT }
}