reman3/Rayman_X/cpa/tempgrp/OGD/src/3DObject.cxx

1585 lines
62 KiB
C++

//
//
//
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vGetPoint(ACP_tdxIndex xNumPoint,MTH3D_tdstVector *p_stPoint)
{
GEO_vGetPointOfObject(GetStruct(),p_stPoint,xNumPoint);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vSetPoint(ACP_tdxIndex xNumPoint,MTH3D_tdstVector *p_stPoint)
{
switch ( GetSaveStatus() )
{
case E_ss_Responsible:
if( !M_bHasPTModification() )
fn_vOwnerSetPoint( xNumPoint, p_stPoint );
break;
case E_ss_Modify:
if( fn_bIsOnInitialState(C_szFormModif) )
{
MTH3D_tdstVector st3D;
// on passe en etat modifie
fn_vClearModificationsList();
// on sauve la valeur initiale
fn_vGetPoint( xNumPoint, &st3D );
// BEGIN CPA2 Cristi Petrescu 98-02-
fn_vAddModification( xNumPoint/*, &st3D */);
// END CPA2 Cristi Petrescu 98-02-
//
fn_vSetCurrentState( C_szFormModif, FALSE) ;
}
else
{
// on sauve la valeur initiale si ce n'est pas déjà fait
if( !fn_p_stGetModification( xNumPoint ) )
{
MTH3D_tdstVector st3D;
fn_vGetPoint( xNumPoint, &st3D );
// BEGIN CPA2 Cristi Petrescu 98-02-
fn_vAddModification( xNumPoint/*, &st3D */);
// END CPA2 Cristi Petrescu 98-02-
}
}
fn_vOwnerSetPoint( xNumPoint, p_stPoint );
break;
case E_ss_NoSave:
fn_vOwnerSetPoint( xNumPoint, p_stPoint );
break;
case E_ss_NoModif:
break;
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
CPA_BaseObject *Geometry3D::fn_p_oGetGameMaterial(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xIndexInElement /*=0*/)
{
GMT_tdxHandleToGameMaterial hGameMaterial;
hGameMaterial = fn_hGetGameMaterial(_hElement, _xIndexInElement);
if ( GMT_fn_b_ulIsValid(hGameMaterial) )
{
CPA_BaseObject *p_oEditorGameMaterial = GetMainWorld()->fn_p_oFindObjectWithEngine(hGameMaterial, C_szGameMaterialTypeName);
if ( p_oEditorGameMaterial )
return p_oEditorGameMaterial;
else if ( ( GetSaveStatus() != E_ss_NoSave ) //this is an error: the handle is valid but no editor game material exists for it
&& ((Geometry3D_Interface*)GetEditor()) -> fn_bShowWarnings() )
{
((Geometry3D_Interface*)GetEditor()) -> fn_vStopWarnings();
SCR_tdst_Link_Table *p_stGameMaterialLinkTable = GMT_fn_p_stGetLinkTable();
SCR_tdst_Link_Value *p_stMaterialEntry = SCR_fnp_st_Link_SearchValue(p_stGameMaterialLinkTable, (unsigned long) hGameMaterial);
CString csMessage1 = "Error referencing GameMaterial";
CString csMessage2 = "Geometry3D::fn_p_oGetGameMaterial";
CString csMessage3 = "The game material referenced by " + GetReferencedSectionName();
if ( p_stMaterialEntry )
csMessage3 += CString(" and named ") + (SCR_M_p_sz_Link_GetKey(p_stMaterialEntry) + SCR_M_ul_Link_GetAdditionalLong(p_stMaterialEntry, 1));
csMessage3 += " has no equivalent editor game material. Check what is wrong with this...";
ERROR_PREPARE_M( C_szOGDModuleNameEro, csMessage1, csMessage2, E_ERROR_GRAVITY_WARNING, csMessage3 );
// ERROR_ASSERT(0);
return NULL;
}
else //we did not find the editor game material, but this is not an object that will be saved, so we dont care
return NULL;
}
else
return NULL;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vSetGameMaterial(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xIndexInElement,CPA_BaseObject *_p_oGMT)
{
GMT_tdxHandleToGameMaterial hMaterialToSet;
if ( _p_oGMT )
hMaterialToSet = (GMT_tdxHandleToGameMaterial)_p_oGMT -> GetData();
else
GMT_fn_vInvalidate(&hMaterialToSet);
fn_vSetEngineGameMaterial( _hElement, _xIndexInElement, hMaterialToSet);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vSetEngineGameMaterial(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xIndexInElement,
GMT_tdxHandleToGameMaterial _hGameMaterial)
{
switch ( GetSaveStatus() )
{
case E_ss_Responsible:
if( !M_bHasGMTModification() )
fn_vOwnerSetMaterial( _hElement, _xIndexInElement, _hGameMaterial);
break;
case E_ss_Modify:
if( fn_bIsOnInitialState(C_szMaterialModif) )
{
// on passe en etat modifie
fn_vClearGMTModificationsList();
// on sauve la valeur initiale
// BEGIN CPA2 Cristi Petrescu 98-02-
fn_vAddGMTModification( _hElement, _xIndexInElement, fn_hGetGameMaterial( _hElement, _xIndexInElement ) );
// END CPA2 Cristi Petrescu 98-02-
//
fn_vSetCurrentState( C_szMaterialModif, FALSE) ;
}
else
{
// on sauve la valeur initiale si ce n'est pas déjà fait
if( !fn_p_stGetGMTModification( _hElement, _xIndexInElement ) )
// BEGIN CPA2 Cristi Petrescu 98-02-
fn_vAddGMTModification( _hElement, _xIndexInElement, fn_hGetGameMaterial( _hElement, _xIndexInElement ) );
// END CPA2 Cristi Petrescu 98-02-
}
fn_vOwnerSetMaterial( _hElement, _xIndexInElement, _hGameMaterial );
break;
case E_ss_NoSave:
fn_vOwnerSetMaterial( _hElement, _xIndexInElement, _hGameMaterial );
break;
case E_ss_NoModif:
break;
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
ACP_tdxIndex Geometry3D::fn_xGetNbIndexedElements(ACP_tdxHandleOfElement _hElement)
{
ACP_tdxIndex _xElementType = GEO_xGetElementType(GetStruct(), _hElement);
ACP_tdxIndex xResult = 0;
GEO_tdstElementFaceMapDescriptors *p_stEFMD;
GEO_tdstElementAltimap *p_stAltimap;
switch( _xElementType )
{
case GEO_C_xElementIndexedTriangles:
xResult = GEO_lGetIndexedTriangleNbFaces(GetStruct(), _hElement);
break;
// BEGIN CPA2 Cristi Petrescu 98-03-
case GEO_C_xElementAltimap:
p_stAltimap = (GEO_tdstElementAltimap *) GetStruct() -> d_stListOfElements[ _hElement ];
xResult = p_stAltimap -> xNbFaces;
break;
// END CPA2 Cristi Petrescu 98-03-
case GEO_C_xElementFaceMapDescriptors:
p_stEFMD = (GEO_tdstElementFaceMapDescriptors*) GetStruct() -> d_stListOfElements[ _hElement ];
xResult = p_stEFMD -> xNbFaces;
break;
case GEO_C_xElementSprites:
case GEO_C_xElementTMeshes:
break;
case GEO_C_xElementPoints:
xResult = GEO_lGetElementPointsNbPoints(GetStruct(), _hElement);
break;
case GEO_C_xElementLines:
xResult = GEO_lGetElementLinesNbLines(GetStruct(), _hElement);
break;
case GEO_C_xElementSpheres:
xResult = GEO_lGetIndexedSphereNbSpheres(GetStruct(), _hElement);
break;
case GEO_C_xElementAlignedBoxes:
xResult = GEO_lGetAlignedBoxNbBoxes(GetStruct(), _hElement);
break;
case GEO_C_xElementCones:
xResult = GEO_lGetConeNbCones(GetStruct(), _hElement);
break;
}
return xResult;
}
/*-----------------------------------------------------------------------------
* Description : return BoundingVolume, and compute it if not exists
*---------------------------------------------------------------------------*/
ACP_tdxHandleOfObject Geometry3D::fn_hGetBoundingVolume()
{
if( m_hBoundingVolume == NULL )
fn_vComputeBoundingVolume( FALSE );
return m_hBoundingVolume;
}
/*-----------------------------------------------------------------------------
* Description :
*---------------------------------------------------------------------------*/
void Geometry3D::fn_vComputeBoundingVolume(BOOL _bRecompute /*=FALSE*/)
{
MTH3D_tdstVector stCenter = {0,0,0};
MTH_tdxReal xRadius = 0.0;
// Bounding volume already allocated ????
if( m_hBoundingVolume == NULL )
{
//ANNECY TQ 22/06/98{
m_hBoundingVolume = GEO_fn_hCreateGeometricSphere();
//ENDANNECY TQ}
_bRecompute = TRUE;
}
// recompute if necessary
if( _bRecompute || m_bMustRecomputeBdV )
{
//ANNECY TQ 22/06/98{
GEO_fn_vAddObjectToSphere(GetStruct(), &stCenter, &xRadius);
GEO_fn_vSetGeometricSphere(&stCenter, xRadius, m_hBoundingVolume);
//ENDANNECY TQ}
}
m_bMustRecomputeBdV = FALSE;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vTranslatePoint(ACP_tdxIndex _xPoint, MTH3D_tdstVector *_p_st3DTranslation)
{
MTH3D_tdstVector x3DPoint;
// translate point
fn_vGetPoint(_xPoint,&x3DPoint);
MTH3D_M_vAddVector(&x3DPoint,&x3DPoint,_p_st3DTranslation);
fn_vSetPoint(_xPoint,&x3DPoint );
m_bMustRecomputeBdV = TRUE;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vAllocAndComputeListOfPointsMaterial(void)
{
if( GetStruct() -> d_hListOfPointsMaterial == NULL )
{
GEO_vCreateObjectListOfPointsMaterial ( GetStruct() );
GEO_vComputeObjectListOfPointsMaterial( GetStruct() );
}
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Object Creation
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_vSetListOfPoints(ACP_tdxIndex xNbPoints, MTH3D_tdstVector *p_stPoint)
{
if(xNbPoints > GEO_xGetGeometricObjectNumberOfPoints( GetStruct() ) )
xNbPoints = GEO_xGetGeometricObjectNumberOfPoints( GetStruct() );
GEO_vSetListOfPointsOfObject ( GetStruct(), p_stPoint , xNbPoints , 0 );
m_bMustRecomputeBdV = TRUE;
return C_Ok;
}
// ----------------------------------------------------------------------------
// Description : allocate and compute internal informations
// ----------------------------------------------------------------------------
void Geometry3D::fn_vEndCreation()
{
if( ! m_bEndCreated )
GEO_vEndCreateObject ( GetStruct() );
m_bEndCreated = TRUE;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Element Creation
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
ACP_tdxHandleOfElement Geometry3D::fn_hCreateElementSpheres(ACP_tdxIndex xNbSpheres)
{
ACP_tdxHandleOfElement hElement;
GEO_vCreateElementSpheres( GetStruct(), &hElement, xNbSpheres);
fn_vInitElementSection( hElement );
return hElement;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetIndexedSphere(ACP_tdxHandleOfElement hElementSphere, ACP_tdxIndex xIndexOfSphere,
ACP_tdxIndex xCenter, MTH_tdxReal xRadius)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere( hElementSphere, xIndexOfSphere ) )
{
GEO_vSetCenterPointOfIndexedSphere( GetStruct(), hElementSphere, xIndexOfSphere, xCenter );
GEO_vSetRadiusOfIndexedSphere( GetStruct(), hElementSphere, xIndexOfSphere, xRadius );
// default matérial
fn_vSetEngineGameMaterial(hElementSphere, xIndexOfSphere, fn_hGetDefaultGameMaterial() );
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
ACP_tdxHandleOfElement Geometry3D::fn_hCreateElementAlignedBox(ACP_tdxIndex xNbAlignedBoxes)
{
ACP_tdxHandleOfElement hElement;
GEO_vCreateElementAlignedBoxes( GetStruct(), &hElement, xNbAlignedBoxes );
fn_vInitElementSection( hElement );
return hElement;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetAlignedBox(ACP_tdxHandleOfElement hElementAlignedBox, ACP_tdxIndex xNumberOfAlignedBox,
ACP_tdxIndex xMinPoint, ACP_tdxIndex xMaxPoint)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsAlignedBox( hElementAlignedBox, xNumberOfAlignedBox ) )
{
GEO_vSetMinMaxPointOfIndexedAlignedBox( GetStruct(), hElementAlignedBox, xNumberOfAlignedBox, xMinPoint, xMaxPoint );
// default matérial
fn_vSetEngineGameMaterial(hElementAlignedBox, xNumberOfAlignedBox, fn_hGetDefaultGameMaterial() );
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
ACP_tdxHandleOfElement Geometry3D::fn_hCreateElementCone(ACP_tdxIndex xNbCones)
{
ACP_tdxHandleOfElement hElement;
GEO_vCreateElementCones( GetStruct(), &hElement, xNbCones );
fn_vInitElementSection( hElement );
return hElement;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetCone(ACP_tdxHandleOfElement hElementCone, ACP_tdxIndex xNumberOfCone,
ACP_tdxIndex xTopPoint, ACP_tdxIndex xBasePoint, MTH_tdxReal xBaseRadius)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsCone( hElementCone, xNumberOfCone ) )
{
GEO_vSetPointsOfIndexedCone( GetStruct(), hElementCone, xNumberOfCone, xTopPoint, xBasePoint);
GEO_vSetRadiusOfIndexedCone( GetStruct(), hElementCone, xNumberOfCone, xBaseRadius);
// default matérial
fn_vSetEngineGameMaterial(hElementCone, xNumberOfCone, fn_hGetDefaultGameMaterial() );
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
ACP_tdxHandleOfElement Geometry3D::fn_hCreateElementIndexedTriangle(ACP_tdxIndex xNbFaces, ACP_tdxIndex xNbElementUV)
{
ACP_tdxHandleOfElement hElement;
GEO_vCreateElementIndexedTriangles( GetStruct(), &hElement, xNbFaces, xNbElementUV );
fn_vInitElementSection( hElement );
// default matérial
fn_vSetEngineGameMaterial(hElement,0, fn_hGetDefaultGameMaterial() );
return hElement;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetIndexedTriangle(ACP_tdxHandleOfElement hElementIT, ACP_tdxIndex xNumberOfFace,
ACP_tdxIndex xPoint1, ACP_tdxIndex xPoint2, ACP_tdxIndex xPoint3)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsIndexedTriangle( hElementIT, xNumberOfFace ) )
{
GEO_vSetFaceOfIndexedTriangles( GetStruct(), hElementIT, xNumberOfFace, xPoint1, xPoint2, xPoint3 );
eResult = C_Ok;
}
return eResult;
}
// BEGIN CPA2 Cristi Petrescu 98-03-
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
ACP_tdxHandleOfElement Geometry3D::fn_hCreateElementAltimap(ACP_tdxIndex xNbVertices, ACP_tdxIndex xNbSquares, ACP_tdxIndex xNbVisibleTriangles, ACP_tdxIndex xNbUVValues, ACP_tdxIndex xNbMaterials)
{
ACP_tdxHandleOfElement hElement;
GEO_vCreateElementAltimap (GetStruct(), &hElement, xNbVertices, xNbSquares, xNbVisibleTriangles, xNbUVValues, xNbMaterials);
fn_vInitElementSection (hElement);
// default matérial
fn_vSetEngineGameMaterial (hElement,0, fn_hGetDefaultGameMaterial());
return hElement;
}
// ----------------------------------------------------------------------------
// Description : fill the atimap with std values
// ----------------------------------------------------------------------------
/*
void Geometry3D::fn_vStandardAltimap (ACP_tdxHandleOfElement hElement)
{
ACP_tdxIndex xWidthCount, xDepthCount;
GEO_tdstElementAltimap *p_stAltimap = (GEO_tdstElementAltimap *) GetStruct () -> d_stListOfElements [hElement];
for (xWidthCount = 0; xWidthCount < p_stAltimap -> xWidth; xWidthCount ++)
{
for (xDepthCount = 0; xDepthCount < p_stAltimap -> xDepth; xDepthCount ++)
{
ACP_tdxIndex xNumSquare = xWidthCount + xDepthCount * p_stAltimap -> xWidth;
// set the squares
GEO_vSetAltimapSquare (GetStruct (), hElement, xNumSquare, GEO_C_xAltiSquareBothTRBL, xNumSquare * 2);
// set the faces
// uvs
GEO_vSetAltimapFaceUVIndex (GetStruct (), hElement, xNumSquare * 2, 0, 1, 3);
GEO_vSetAltimapFaceUVIndex (GetStruct (), hElement, xNumSquare * 2 + 1, 0, 2, 3);
// materials
// ############
//GEO_vSetAltimapFaceGameMaterial (GetStruct (), hElement, xNumSquare * 2, fn_hGetDefaultGameMaterial ());
//GEO_vSetAltimapFaceGameMaterial (GetStruct (), hElement, xNumSquare * 2 + 1, fn_hGetDefaultGameMaterial ());
// and a normals ?!
}
}
GEO_vSetAltimapNbFaces (GetStruct (), hElement, p_stAltimap -> xWidth * p_stAltimap -> xDepth * 2);
// set the uv values
ACP_tdst2DUVValues stUV0 = {0.0, 0.0};
GEO_vSetAltimapUVValue (GetStruct (), hElement, 0, stUV0);
ACP_tdst2DUVValues stUV1 = {1.0, 0.0};
GEO_vSetAltimapUVValue (GetStruct (), hElement, 1, stUV1);
ACP_tdst2DUVValues stUV2 = {0.0, 1.0};
GEO_vSetAltimapUVValue (GetStruct (), hElement, 2, stUV2);
ACP_tdst2DUVValues stUV3 = {1.0, 1.0};
GEO_vSetAltimapUVValue (GetStruct (), hElement, 3, stUV3);
GEO_vSetAltimapNbUVValues (GetStruct (), hElement, 4);
// set the normals
if(GetStruct()->d_stListOfPointsNormals)
GEO_M_CPAFree(GetStruct()->d_stListOfPointsNormals);
if(GetStruct()->d_hListOfPointsMaterial)
GEO_M_CPAFree(GetStruct()->d_hListOfPointsMaterial);
if(GetStruct()->d_stListOfEdges)
GEO_M_CPAFree(GetStruct()->d_stListOfEdges);
if(GetStruct()->d_stListOfPointsReceivedLightIntensity)
GEO_M_CPAFree(GetStruct()->d_stListOfPointsReceivedLightIntensity);
GEO_xCreateObjectPointNormals (GetStruct());
GEO_vCreateObjectListOfPointsMaterial(GetStruct());
GEO_xCreateObjectListOfEdges(GetStruct());
GEO_xComputeObjectNormals (GetStruct());
GEO_vComputeObjectListOfPointsMaterial(GetStruct());
GEO_xComputeObjectListOfEdges(GetStruct());
}
*/
// END CPA2 Cristi Petrescu 98-03-
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
ACP_tdxHandleOfElement Geometry3D::fn_hCreateElementPoints(ACP_tdxIndex xNumberOfPoints)
{
ACP_tdxHandleOfElement hElement;
GEO_xCreateElementPoints( GetStruct(), &hElement, xNumberOfPoints );
fn_vInitElementSection( hElement );
// default matérial
fn_vSetEngineGameMaterial(hElement, 0, fn_hGetDefaultGameMaterial() );
return hElement;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetIndexedPoint(ACP_tdxHandleOfElement hElementPoint, ACP_tdxIndex xNumberOfPoint,
ACP_tdxIndex xIndexOfPoint)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsPoint( hElementPoint, xNumberOfPoint ) )
{
GEO_xSetIndexOfElementPoints( GetStruct(), hElementPoint, xNumberOfPoint, xIndexOfPoint );
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetFatnessOfElementPoint(ACP_tdxHandleOfElement hElementPoint,
MTH_tdxReal xFatness)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsPoint( hElementPoint, 0 ) )
{
GEO_xSetFatnessOfElementPoints( GetStruct(), hElementPoint, xFatness );
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Element Modification
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetConePoints(ACP_tdxHandleOfElement hElementCone, ACP_tdxIndex xNumberOfCone,
ACP_tdxIndex xTopPoint, ACP_tdxIndex xBasePoint)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsCone( hElementCone, xNumberOfCone ) )
{
GEO_vSetPointsOfIndexedCone( GetStruct(), hElementCone, xNumberOfCone, xTopPoint, xBasePoint);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetConeBaseRadius(ACP_tdxHandleOfElement hElementCone, ACP_tdxIndex xNumberOfCone,
MTH_tdxReal xBaseRadius)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsCone( hElementCone, xNumberOfCone ) )
{
GEO_vSetRadiusOfIndexedCone( GetStruct(), hElementCone, xNumberOfCone, xBaseRadius);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eGetConePoints(ACP_tdxHandleOfElement hElementCone, ACP_tdxIndex xNumberOfCone,
ACP_tdxIndex *_p_xTopPoint, ACP_tdxIndex *_p_xBasePoint)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsCone( hElementCone, xNumberOfCone ) )
{
GEO_vGetPointsOfIndexedCone( GetStruct(), hElementCone, xNumberOfCone, _p_xTopPoint, _p_xBasePoint);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
MTH_tdxReal Geometry3D::fn_xGetConeBaseRadius(ACP_tdxHandleOfElement hElementCone, ACP_tdxIndex xNumberOfCone)
{
MTH_tdxReal xResult = 0;
if ( fn_bIsCone( hElementCone, xNumberOfCone ) )
{
xResult = GEO_xGetRadiusOfIndexedCone( GetStruct(), hElementCone, xNumberOfCone);
}
return xResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eGetIndexedTrianglePoints(ACP_tdxHandleOfElement hElementIT, ACP_tdxIndex xNumberOfFace,
ACP_tdxIndex *_p_xPt1, ACP_tdxIndex *_p_xPt2, ACP_tdxIndex *_p_xPt3)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsIndexedTriangle( hElementIT, xNumberOfFace ) )
{
GEO_vGetFaceOfIndexedTriangles( GetStruct(), hElementIT, xNumberOfFace, _p_xPt1, _p_xPt2, _p_xPt3 );
eResult = C_Ok;
}
return eResult;
}
// BEGIN CPA2 Cristi Petrescu 98-03-
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// altimaps
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::fn_eGetOrigin
// Date : 98.03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : gets the altimap origin
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
tdeGeomResult Geometry3D::fn_eGetOrigin (MTH3D_tdstVector *p_st3DPoint, ACP_tdxHandleOfElement hElement)
{
tdeGeomResult eResult = C_BadElement;
if (fn_bIsAltimap (hElement))
{
GEO_vGetAltimapOrigin (GetStruct (), hElement, p_st3DPoint);
eResult = C_Ok;
}
return eResult;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::fn_eSetOrigin
// Date : 98.03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : sets the altimap origin
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
tdeGeomResult Geometry3D::fn_eSetOrigin (MTH3D_tdstVector st3DPoint, ACP_tdxHandleOfElement hElement)
{
tdeGeomResult eResult = C_BadElement;
if (fn_bIsAltimap (hElement))
{
GEO_vSetAltimapOrigin (GetStruct (), hElement, st3DPoint);
eResult = C_Ok;
}
return eResult;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::fn_eGetSquarePattern
// Date : 98.03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : gets the altimap square parameters
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
tdeGeomResult Geometry3D::fn_eGetSquarePattern (ACP_tdxIndex *p_xWidth, MTH_tdxReal *p_xSquareDimX, ACP_tdxIndex *p_xDepth, MTH_tdxReal *p_xSquareDimY, ACP_tdxHandleOfElement hElement)
{
tdeGeomResult eResult = C_BadElement;
if (fn_bIsAltimap (hElement))
{
GEO_vGetAltimapSquarePattern (GetStruct (), hElement, p_xWidth, p_xSquareDimX, p_xDepth, p_xSquareDimY);
eResult = C_Ok;
}
return eResult;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::fn_eSetSquarePattern
// Date : 98.03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : sets the altimap square parameters
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
tdeGeomResult Geometry3D::fn_eSetSquarePattern (ACP_tdxIndex xWidth, MTH_tdxReal xSquareDimX, ACP_tdxIndex xDepth, MTH_tdxReal xSquareDimY, ACP_tdxHandleOfElement hElement)
{
tdeGeomResult eResult = C_BadElement;
if (fn_bIsAltimap (hElement))
{
GEO_tdstElementAltimap *p_stAltimap = (GEO_tdstElementAltimap *) GetStruct () -> d_stListOfElements[hElement];
ACP_tdxIndex xOldWidth = p_stAltimap -> xWidth;
ACP_tdxIndex xOldDepth = p_stAltimap -> xDepth;
MTH_tdxReal xOldSquareDimX = p_stAltimap -> xDeltaX;
MTH_tdxReal xOldSquareDimY = p_stAltimap -> xDeltaY;
GEO_vSetAltimapSquarePattern (GetStruct (), hElement, xWidth, xSquareDimX, xDepth, xSquareDimY);
// coherence matter
if (xOldWidth != xWidth || xOldDepth != xDepth)
{
// array of heights
MTH_tdxReal *d_xOldHeight = p_stAltimap -> d_xHeight;
GEO_M_CPAMalloc (p_stAltimap -> d_xHeight,
MTH_tdxReal *,
(xWidth + 1) * (xDepth + 1) * sizeof (MTH_tdxReal),
E_uwGEONotEnoughtMemory);
for (ACP_tdxIndex xWidthCount = 0; xWidthCount < xWidth + 1; xWidthCount ++)
{
for (ACP_tdxIndex xDepthCount = 0; xDepthCount < xDepth + 1; xDepthCount ++)
{
// linear interpolate the old values
ACP_tdxIndex xMinWidth = xWidthCount * xOldWidth / xWidth;
ACP_tdxIndex xMinDepth = xDepthCount * xOldDepth / xDepth ;
ACP_tdxIndex xMaxWidth = xMinWidth < xOldWidth ? xMinWidth + 1 : xOldWidth;
ACP_tdxIndex xMaxDepth = xMinDepth < xOldDepth ? xMinDepth + 1: xOldDepth;
// the corner values
MTH_tdxReal xHwd = d_xOldHeight [xMinWidth + (xOldWidth + 1) * xMinDepth];
MTH_tdxReal xHWd = d_xOldHeight [xMaxWidth + (xOldWidth + 1) * xMinDepth];
MTH_tdxReal xHWD = d_xOldHeight [xMaxWidth + (xOldWidth + 1) * xMaxDepth];
MTH_tdxReal xHwD = d_xOldHeight [xMinWidth + (xOldWidth + 1) * xMaxDepth];
// the interpolation values (fractionary part)
MTH_tdxReal xS = ((MTH_tdxReal) xWidthCount) * xOldWidth / xWidth - xMinWidth;
MTH_tdxReal xT = ((MTH_tdxReal) xDepthCount) * xOldDepth / xDepth - xMinDepth;
// the medium value
MTH_tdxReal xInterpolatedHeight = (xT * (xS * xHwd + (1 - xS) * xHWd) + (1 - xT) * (xS * xHwD + (1 - xS) * xHWD) +
xS * (xT * xHwd + (1 - xT) * xHwD) + (1 - xS) * (xT * xHWd + (1 - xT) * xHWD)) / 2;
//MTH_tdxReal xInterpolatedHeight = -0.4;
p_stAltimap -> d_xHeight [xWidthCount + (xWidth + 1) * xDepthCount] = xInterpolatedHeight;
}
}
GEO_M_CPAFree (d_xOldHeight);
// reallocs
// BECAUSE SOMEBODY SETS THIS TO WRONG VALUES IN RENDER FUNCTIONS
// WHY ????????????
// the Object points
GetStruct () -> xNbPoints += (xWidth + 1) * (xDepth + 1);
GetStruct () -> xNbPoints -= (xOldWidth + 1) * (xOldDepth + 1);
GEO_M_CPAFree (GetStruct () -> d_stListOfPoints);
GEO_M_CPAMalloc( GetStruct () -> d_stListOfPoints,
MTH3D_tdstVector *,
(xWidth + 1) * (xDepth + 1) * sizeof( MTH3D_tdstVector ),
E_uwGEONotEnoughtMemory );
//--- Array of Point Normals ---
GEO_M_CPAFree ( p_stAltimap->d_stPointNormals);
GEO_M_CPAMalloc( p_stAltimap->d_stPointNormals,
MTH3D_tdstVector *,
(xWidth + 1) * (xDepth + 1) * sizeof( MTH3D_tdstVector ),
E_uwGEONotEnoughtMemory );
//--- Array of Square Descriptors ---
GEO_M_CPAFree ( p_stAltimap->d_stSquare);
GEO_M_CPAMalloc( p_stAltimap->d_stSquare,
GEO_tdstAltimapSquare *,
xWidth * xDepth * sizeof( GEO_tdstAltimapSquare ),
E_uwGEONotEnoughtMemory );
//--- Array of Face descriptors ---
GEO_M_CPAFree ( p_stAltimap->d_stFaces);
GEO_M_CPAMalloc( p_stAltimap->d_stFaces,
GEO_tdstAltimapFace *,
2 * xWidth * xDepth * sizeof( GEO_tdstAltimapFace ),
E_uwGEONotEnoughtMemory );
GEO_M_CPAFree ( p_stAltimap->d_stUVValues);
GEO_M_CPAMalloc( p_stAltimap->d_stUVValues,
ACP_tdst2DUVValues *,
4 * sizeof( ACP_tdst2DUVValues ), // the Editor std. value
E_uwGEONotEnoughtMemory );
// standard inits
fn_vStandardAltimap (hElement);
}
}
return eResult;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::fn_eSetNbFaces
// Date : 98.03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : computes the nuber of visible triangles
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
tdeGeomResult Geometry3D::fn_eSetNbFaces (ACP_tdxIndex xNbSquares, ACP_tdxHandleOfElement hElement)
{
tdeGeomResult eResult = C_BadElement;
if (fn_bIsAltimap (hElement))
{
// count the number of visible faces
ACP_tdxIndex xNbFaces = 0;
for (ACP_tdxIndex xCount = 0; xCount < xNbSquares; xCount ++)
{
unsigned char ucType;
ACP_tdxIndex xDummy;
GEO_vGetAltimapSquare (GetStruct (), hElement, xCount, & ucType, & xDummy);
switch (ucType)
{
case GEO_C_xAltiSquareVoid:
break;
case GEO_C_xAltiSquareTopRight:
case GEO_C_xAltiSquareBottomLeft:
case GEO_C_xAltiSquareTopLeft:
case GEO_C_xAltiSquareBottomRight:
xNbFaces ++;
break;
case GEO_C_xAltiSquareBothTRBL:
case GEO_C_xAltiSquareBothTLBR:
xNbFaces += 2;
break;
default:
ASSERT (FALSE);
}
}
GEO_vSetAltimapNbFaces (GetStruct (), hElement, xNbFaces);
}
return eResult;
}
*/
// END CPA2 Cristi Petrescu 98-03-
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// spheres
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
/* -----------------09/01/97 11:03-------------------
Description : get the center of the sphere
--------------------------------------------------*/
tdeGeomResult Geometry3D::fn_eGetCenter(MTH3D_tdstVector *p_st3DCenter, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere(hElement,xNumSphere) )
{
ACP_tdxIndex xCenter = GEO_xGetCenterPointOfIndexedSphere(GetStruct(),hElement,xNumSphere);
fn_vGetPoint(xCenter,p_st3DCenter);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eGetCenterX(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
MTH3D_tdstVector st3DCenter;
tdeGeomResult eResult = fn_eGetCenter(&st3DCenter,hElement,xNumSphere);
if( eResult == C_Ok )
*p_xValue = MTH3D_M_xGetXofVector(&st3DCenter);
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eGetCenterY(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
MTH3D_tdstVector st3DCenter;
tdeGeomResult eResult = fn_eGetCenter(&st3DCenter,hElement,xNumSphere);
if( eResult == C_Ok )
*p_xValue = MTH3D_M_xGetYofVector(&st3DCenter);
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eGetCenterZ(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
MTH3D_tdstVector st3DCenter;
tdeGeomResult eResult = fn_eGetCenter(&st3DCenter,hElement,xNumSphere);
if( eResult == C_Ok )
*p_xValue = MTH3D_M_xGetZofVector(&st3DCenter);
return eResult;
}
/* -----------------09/01/97 11:14-------------------
Description : set the center of a sphere
--------------------------------------------------*/
tdeGeomResult Geometry3D::fn_eSetCenter(MTH3D_tdstVector *p_stPoint, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere(hElement,xNumSphere) )
{
ACP_tdxIndex xCenter = GEO_xGetCenterPointOfIndexedSphere(GetStruct(),hElement,xNumSphere);
fn_vSetPoint(xCenter,p_stPoint);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetCenterX(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere(hElement,xNumSphere) )
{
ACP_tdxIndex xCenter = GEO_xGetCenterPointOfIndexedSphere(GetStruct(),hElement,xNumSphere);
MTH3D_tdstVector st3DCenter;
fn_vGetPoint(xCenter,&st3DCenter);
MTH3D_M_vSetXofVector(&st3DCenter,*p_xValue);
fn_vSetPoint(xCenter,&st3DCenter);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetCenterY(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere(hElement,xNumSphere) )
{
ACP_tdxIndex xCenter = GEO_xGetCenterPointOfIndexedSphere(GetStruct(),hElement,xNumSphere);
MTH3D_tdstVector st3DCenter;
fn_vGetPoint(xCenter,&st3DCenter);
MTH3D_M_vSetYofVector(&st3DCenter,*p_xValue);
fn_vSetPoint(xCenter,&st3DCenter);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetCenterZ(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere(hElement,xNumSphere) )
{
ACP_tdxIndex xCenter = GEO_xGetCenterPointOfIndexedSphere(GetStruct(),hElement,xNumSphere);
MTH3D_tdstVector st3DCenter;
fn_vGetPoint(xCenter,&st3DCenter);
MTH3D_M_vSetZofVector(&st3DCenter,*p_xValue);
fn_vSetPoint(xCenter,&st3DCenter);
eResult = C_Ok;
}
return eResult;
}
/* -----------------09/01/97 11:22-------------------
Description : get radius of sphere
--------------------------------------------------*/
tdeGeomResult Geometry3D::fn_eGetRadius(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere(hElement,xNumSphere) )
{
*p_xValue = GEO_xGetRadiusOfIndexedSphere(GetStruct(),hElement,xNumSphere);
eResult = C_Ok;
}
return eResult;
}
/* -----------------09/01/97 11:23-------------------
Description : Set radius of sphere
--------------------------------------------------*/
tdeGeomResult Geometry3D::fn_eSetRadius(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/,
ACP_tdxIndex xNumSphere /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsSphere(hElement,xNumSphere) )
{
if( MTH_M_bLessZero(*p_xValue) )
{
eResult = C_BadValue;
*p_xValue = MTH_C_ZERO ;
}
else
eResult = C_Ok ;
// update radius
GEO_vSetRadiusOfIndexedSphere(GetStruct(),hElement,xNumSphere,*p_xValue);
}
return eResult;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Aligned box
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
/* -----------------09/01/97 11:50-------------------
Description : get MinPoint of AlignedBox
--------------------------------------------------*/
tdeGeomResult Geometry3D::fn_eGetMinPoint(MTH3D_tdstVector *p_st3DPoint, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsAlignedBox(hElement,xNumBox) )
{
ACP_tdxIndex xMinPoint,xMaxPoint;
GEO_vGetMinMaxPointOfIndexedAlignedBox(GetStruct(),hElement,xNumBox,&xMinPoint,&xMaxPoint);
fn_vGetPoint(xMinPoint,p_st3DPoint);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMinPoint(MTH3D_tdstVector *p_st3DPoint, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
MTH_tdxReal xValueX = MTH3D_M_xGetXofVector(p_st3DPoint);
tdeGeomResult eResultX = fn_eSetMinPointX( &xValueX, hElement, xNumBox);
MTH_tdxReal xValueY = MTH3D_M_xGetYofVector(p_st3DPoint);
tdeGeomResult eResultY = fn_eSetMinPointY( &xValueY, hElement, xNumBox);
MTH_tdxReal xValueZ = MTH3D_M_xGetZofVector(p_st3DPoint);
tdeGeomResult eResultZ = fn_eSetMinPointZ( &xValueZ, hElement, xNumBox);
if( (eResultX != C_Ok) || (eResultY != C_Ok) || (eResultZ != C_Ok) )
{
MTH3D_M_vSetVectorElements(p_st3DPoint,xValueX,xValueY,xValueZ);
return C_BadValue;
}
return C_Ok;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMinPointX(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMinPoint(C_Set,C_X,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMinPointY(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMinPoint(C_Set,C_Y,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMinPointZ(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMinPoint(C_Set,C_Z,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eIncMinPointX(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMinPoint(C_Inc,C_X,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eIncMinPointY(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMinPoint(C_Inc,C_Y,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eIncMinPointZ(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMinPoint(C_Inc,C_Z,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eModifyMinPoint(tdeModifType eModif,tdeCompoType eCompo,MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsAlignedBox(hElement,xNumBox) )
{
ACP_tdxIndex xMinPoint,xMaxPoint;
MTH3D_tdstVector stMinPoint;
MTH3D_tdstVector stMaxPoint;
GEO_vGetMinMaxPointOfIndexedAlignedBox(GetStruct(),hElement,xNumBox,&xMinPoint,&xMaxPoint);
fn_vGetPoint(xMinPoint,&stMinPoint);
fn_vGetPoint(xMaxPoint,&stMaxPoint);
// change value
switch ( eCompo )
{
case C_X:
// update
if( eModif == C_Set)
{
MTH3D_M_vSetXofVector(&stMinPoint,*p_xValue);
}
else if ( eModif == C_Inc )
{
MTH3D_M_vSetXofVector(&stMinPoint,MTH_M_xAdd(*p_xValue,MTH3D_M_xGetXofVector(&stMinPoint)));
}
// verify
if(MTH_M_bLessEqual(MTH3D_M_xGetXofVector(&stMinPoint),MTH3D_M_xGetXofVector(&stMaxPoint)))
eResult = C_Ok;
else
{
eResult = C_BadValue;
MTH3D_M_vSetXofVector(&stMinPoint,MTH3D_M_xGetXofVector(&stMaxPoint));
}
break;
case C_Y:
// update
if( eModif == C_Set)
{
MTH3D_M_vSetYofVector(&stMinPoint,*p_xValue);
}
else if ( eModif == C_Inc )
{
MTH3D_M_vSetYofVector(&stMinPoint,MTH_M_xAdd(*p_xValue,MTH3D_M_xGetYofVector(&stMinPoint)));
}
// verify
if(MTH_M_bLessEqual(MTH3D_M_xGetYofVector(&stMinPoint),MTH3D_M_xGetYofVector(&stMaxPoint)))
eResult = C_Ok;
else
{
eResult = C_BadValue;
MTH3D_M_vSetYofVector(&stMinPoint,MTH3D_M_xGetYofVector(&stMaxPoint));
}
break;
case C_Z:
// update
if( eModif == C_Set)
{
MTH3D_M_vSetZofVector(&stMinPoint,*p_xValue);
}
else if ( eModif == C_Inc )
{
MTH3D_M_vSetZofVector(&stMinPoint,MTH_M_xAdd(*p_xValue,MTH3D_M_xGetZofVector(&stMinPoint)));
}
// verify
if( MTH_M_bLessEqual(MTH3D_M_xGetZofVector(&stMinPoint),MTH3D_M_xGetZofVector(&stMaxPoint)) )
eResult = C_Ok ;
else
{
eResult = C_BadValue ;
MTH3D_M_vSetZofVector(&stMinPoint,MTH3D_M_xGetZofVector(&stMaxPoint));
}
break;
}
fn_vSetPoint(xMinPoint,&stMinPoint);
}
return eResult;
}
/* -----------------09/01/97 11:51-------------------
Description : Get MAxPoint of AlignedBox
--------------------------------------------------*/
tdeGeomResult Geometry3D::fn_eGetMaxPoint(MTH3D_tdstVector *p_st3DPoint, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsAlignedBox(hElement,xNumBox) )
{
ACP_tdxIndex xMinPoint,xMaxPoint;
GEO_vGetMinMaxPointOfIndexedAlignedBox(GetStruct(),hElement,xNumBox,&xMinPoint,&xMaxPoint);
fn_vGetPoint(xMaxPoint,p_st3DPoint);
eResult = C_Ok;
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMaxPoint(MTH3D_tdstVector *p_st3DPoint, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
MTH_tdxReal xValueX = MTH3D_M_xGetXofVector(p_st3DPoint);
tdeGeomResult eResultX = fn_eSetMaxPointX( &xValueX, hElement, xNumBox);
MTH_tdxReal xValueY = MTH3D_M_xGetYofVector(p_st3DPoint);
tdeGeomResult eResultY = fn_eSetMaxPointY( &xValueY, hElement, xNumBox);
MTH_tdxReal xValueZ = MTH3D_M_xGetZofVector(p_st3DPoint);
tdeGeomResult eResultZ = fn_eSetMaxPointZ( &xValueZ, hElement, xNumBox);
if( (eResultX != C_Ok) || (eResultY != C_Ok) || (eResultZ != C_Ok) )
{
MTH3D_M_vSetVectorElements(p_st3DPoint,xValueX,xValueY,xValueZ);
return C_BadValue;
}
return C_Ok;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMaxPointX(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMaxPoint(C_Set,C_X,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMaxPointY(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMaxPoint(C_Set,C_Y,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eSetMaxPointZ(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMaxPoint(C_Set,C_Z,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eIncMaxPointX(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMaxPoint(C_Inc,C_X,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eIncMaxPointY(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMaxPoint(C_Inc,C_Y,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eIncMaxPointZ(MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
return fn_eModifyMaxPoint(C_Inc,C_Z,p_xValue,hElement,xNumBox);
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdeGeomResult Geometry3D::fn_eModifyMaxPoint(tdeModifType eModif,tdeCompoType eCompo,MTH_tdxReal *p_xValue, ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
tdeGeomResult eResult = C_BadElement;
if ( fn_bIsAlignedBox(hElement,xNumBox) )
{
ACP_tdxIndex xMinPoint,xMaxPoint;
MTH3D_tdstVector stMinPoint;
MTH3D_tdstVector stMaxPoint;
GEO_vGetMinMaxPointOfIndexedAlignedBox(GetStruct(),hElement,xNumBox,&xMinPoint,&xMaxPoint);
fn_vGetPoint(xMinPoint,&stMinPoint);
fn_vGetPoint(xMaxPoint,&stMaxPoint);
// change value
switch ( eCompo )
{
case C_X:
// update
if( eModif == C_Set)
{
MTH3D_M_vSetXofVector(&stMaxPoint,*p_xValue);
}
else if ( eModif == C_Inc )
{
MTH3D_M_vSetXofVector(&stMaxPoint,MTH_M_xAdd(*p_xValue,MTH3D_M_xGetXofVector(&stMaxPoint)));
}
// verify
if(MTH_M_bLessEqual(MTH3D_M_xGetXofVector(&stMinPoint),MTH3D_M_xGetXofVector(&stMaxPoint)))
eResult = C_Ok;
else
{
eResult = C_BadValue ;
MTH3D_M_vSetXofVector(&stMaxPoint,MTH3D_M_xGetXofVector(&stMinPoint));
}
break;
case C_Y:
// update
if( eModif == C_Set)
{
MTH3D_M_vSetYofVector(&stMaxPoint,*p_xValue);
}
else if ( eModif == C_Inc )
{
MTH3D_M_vSetYofVector(&stMaxPoint,MTH_M_xAdd(*p_xValue,MTH3D_M_xGetYofVector(&stMaxPoint)));
}
// verify
if(MTH_M_bLessEqual(MTH3D_M_xGetYofVector(&stMinPoint),MTH3D_M_xGetYofVector(&stMaxPoint)))
eResult = C_Ok;
else
{
eResult = C_BadValue ;
MTH3D_M_vSetYofVector(&stMaxPoint,MTH3D_M_xGetYofVector(&stMinPoint));
}
break;
case C_Z:
// update
if( eModif == C_Set)
{
MTH3D_M_vSetZofVector(&stMaxPoint,*p_xValue);
}
else if ( eModif == C_Inc )
{
MTH3D_M_vSetZofVector(&stMaxPoint,MTH_M_xAdd(*p_xValue,MTH3D_M_xGetZofVector(&stMaxPoint)));
}
// verify
if(MTH_M_bLessEqual(MTH3D_M_xGetZofVector(&stMinPoint),MTH3D_M_xGetZofVector(&stMaxPoint)))
eResult = C_Ok;
else
{
eResult = C_BadValue ;
MTH3D_M_vSetZofVector(&stMaxPoint,MTH3D_M_xGetZofVector(&stMinPoint));
}
break;
}
fn_vSetPoint(xMaxPoint,&stMaxPoint);
}
return eResult;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vMoveFaceToFaceDescriptors(ACP_tdxIndex xElementIT, ACP_tdxIndex xFaceIT, ACP_tdxIndex *p_xElementFMD, ACP_tdxIndex *p_xFaceFMD)
{
// ANNECY MT - 15/09/98 {
// END ANNECY MT }
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vMoveFaceDescriptorsToFace(ACP_tdxIndex xElementFMD, ACP_tdxIndex xFaceFMD, ACP_tdxIndex xElementIT, ACP_tdxIndex xFaceIT)
{
// ANNECY MT - 15/09/98 {
// END ANNECY MT }
}
//
// protected methods
//
/* -----------------09/01/97 10:48-------------------
Description : TRUE if (hElement,xNumSphere) references a sphere
--------------------------------------------------*/
BOOL Geometry3D::fn_bIsSphere(ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumSphere /*=0*/)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementSpheres) &&
(xNumSphere < GEO_lGetIndexedSphereNbSpheres(GetStruct(),xNumElement)) );
}
/* -----------------09/01/97 11:44-------------------
Description : TRUE if (hElement,xNumBox) references a box
--------------------------------------------------*/
BOOL Geometry3D::fn_bIsAlignedBox(ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumBox /*=0*/)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementAlignedBoxes) &&
(xNumBox < GEO_lGetAlignedBoxNbBoxes(GetStruct(),xNumElement)) );
}
/* -------------------------------------------------
Description : TRUE if (hElement,xNumCone) references a cone
--------------------------------------------------*/
BOOL Geometry3D::fn_bIsCone(ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumCone /*=0*/)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementCones) &&
(xNumCone < GEO_lGetConeNbCones(GetStruct(),xNumElement)) );
}
/* -------------------------------------------------
Description : TRUE if (hElement,xNumFace) references a face of an IndexedTriangle
--------------------------------------------------*/
BOOL Geometry3D::fn_bIsIndexedTriangle(ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumFace /*=0*/)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementIndexedTriangles) /*&&
(xNumFace < GEO_lGetITNbFaces(GetStruct(),xNumElement))*/ );
}
/* -------------------------------------------------
Description : TRUE if (hElement,xNumPoint) references a Point
--------------------------------------------------*/
BOOL Geometry3D::fn_bIsPoint(ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumPoint /*=0*/)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementPoints) &&
(xNumPoint < GEO_lGetElementPointsNbPoints(GetStruct(),xNumElement)) );
}
/* -------------------------------------------------
Description : TRUE if (hElement,xNumLine) references a Line
--------------------------------------------------*/
BOOL Geometry3D::fn_bIsLine(ACP_tdxHandleOfElement hElement /*=0*/, ACP_tdxIndex xNumLine /*=0*/)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementLines) &&
(xNumLine < GEO_lGetElementLinesNbLines(GetStruct(),xNumElement)) );
}
// BEGIN CPA2 Cristi Petrescu 98-03-
/* -------------------------------------------------
Description : TRUE if (hElement,xNumLine) references an Altimap
--------------------------------------------------*/
BOOL Geometry3D::fn_bIsAltimap(ACP_tdxHandleOfElement hElement)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementAltimap) );
}
// END CPA2 Cristi Petrescu 98-03-
BOOL Geometry3D::fn_bIsFMD(ACP_tdxHandleOfElement hElement, ACP_tdxIndex xNumFace /*=0*/)
{
ACP_tdxIndex xNumElement = (ACP_tdxIndex)hElement;
GEO_tdstElementFaceMapDescriptors *p_stEFMD = (GEO_tdstElementFaceMapDescriptors*) GetStruct() -> d_stListOfElements[ hElement ];
return ( (xNumElement < GEO_xGetGeometricObjectNumberOfElements(GetStruct())) &&
(GEO_xGetElementType(GetStruct(),hElement) == GEO_C_xElementFaceMapDescriptors) &&
(xNumFace < p_stEFMD -> xNbFaces) );
}
// ----------------------------------------------------------------------------
// Description : Compute referenced section name of given element
// ----------------------------------------------------------------------------
void Geometry3D::fn_vComputeElementReferencedSectionName(char *_szSectionName, ACP_tdxHandleOfElement _hElement)
{
char szFileName [ SCR_CV_ui_Cfg_MaxLenName ];
char szElementName[ SCR_CV_ui_Cfg_MaxLenName ];
char szElementType[ SCR_CV_ui_Cfg_MaxLenName ];
// get file name
SCR_fn_v_RdL0_SplitSectionName( (char*)(LPCTSTR)GetReferencedSectionName(), szFileName, NULL, NULL );
// get action name
sprintf( szElementType, "Element%s", g_szElementTypeName[ GEO_xGetElementType( GetStruct(), _hElement ) ] );
// get Id name
sprintf( szElementName, "%s_element%02d", (char*)(LPCTSTR) GetName(), _hElement );
// compute section name
SCR_fn_v_RdL0_ComputeSectionName( _szSectionName, szFileName, szElementType, szElementName );
//
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vInitElementSection(ACP_tdxHandleOfElement _hElement)
{
if( fn_bCanBeNotified() )
{
char szSectionName[ SCR_CV_ui_Cfg_MaxLenName ];
// find CPA_Section
POSITION xPos = m_oListOfElementSections . FindIndex( _hElement );
if( xPos )
{
SectionElement *p_oSection = m_oListOfElementSections . GetAt( xPos );
//compute referenced section name
fn_vComputeElementReferencedSectionName( szSectionName, _hElement );
p_oSection -> SetReferencedSectionName(szSectionName);
p_oSection -> SetElement( (void*) GetStruct() -> d_stListOfElements[ _hElement ] );
}
}
}