Init
This commit is contained in:
175
exchange/exchangesource/Collision/createtessellatedbox.cpp
Normal file
175
exchange/exchangesource/Collision/createtessellatedbox.cpp
Normal file
@@ -0,0 +1,175 @@
|
||||
/***********************************************************************************************************************
|
||||
*
|
||||
* Copyright (c) 2010 - 2022 by Tech Soft 3D, Inc.
|
||||
* The information contained herein is confidential and proprietary to Tech Soft 3D, Inc., and considered a trade secret
|
||||
* as defined under civil and criminal statutes. Tech Soft 3D shall pursue its civil and criminal remedies in the event
|
||||
* of unauthorized use or misappropriation of its trade secrets. Use of this information by anyone other than authorized
|
||||
* employees of Tech Soft 3D, Inc. is granted only under a written non-disclosure agreement, expressly prescribing the
|
||||
* scope and manner of such use.
|
||||
*
|
||||
***********************************************************************************************************************/
|
||||
/**
|
||||
\file createtessellatedbox.cpp
|
||||
|
||||
This file demonstrates how to create a simple A3DPolyBrepModel with triangle only from a A3DBoundingBoxData.
|
||||
It's based on the CreatePRCCubes samples
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#include <A3DSDKIncludes.h>
|
||||
#include "../common.hpp"
|
||||
|
||||
static A3DDouble stCubeNormals[18] = {
|
||||
1., 0., 0.,
|
||||
-1., 0., 0.,
|
||||
0., 1., 0.,
|
||||
0., -1., 0.,
|
||||
0., 0., 1.,
|
||||
0., 0., -1.
|
||||
};
|
||||
|
||||
static A3DUns32 stCubeFacesNormalPTriangles[48] =
|
||||
{
|
||||
// N, P, P, P, N, P, P, P
|
||||
12, 0, 3, 6, 12, 6, 3, 9, // Face 0
|
||||
6, 6, 9, 12, 6, 12, 9, 15, // Face 1
|
||||
15, 12, 15, 18, 15, 18, 15, 21, // Face 2
|
||||
9, 18, 21, 0, 9, 0, 21, 3, // Face 3
|
||||
0, 3, 21, 9, 0, 9, 21, 15, // Face 4
|
||||
3, 18, 0, 12, 3, 12, 0, 6, // Face 5
|
||||
};
|
||||
|
||||
//#####################################################################################################################
|
||||
static void freeTess3DData(A3DTess3DData& sTess3DData)
|
||||
{
|
||||
free(sTess3DData.m_pdNormals);
|
||||
free(sTess3DData.m_puiTriangulatedIndexes);
|
||||
for (A3DUns32 ui = 0; ui < sTess3DData.m_uiFaceTessSize; ++ui)
|
||||
{
|
||||
free(sTess3DData.m_psFaceTessData[ui].m_puiSizesTriangulated);
|
||||
}
|
||||
free(sTess3DData.m_psFaceTessData);
|
||||
|
||||
}
|
||||
|
||||
//#####################################################################################################################
|
||||
// Create a A3DTess3D from a A3DBoundingBoxData with only triangles
|
||||
static A3DStatus CreateA3DTess3DFromABBox(A3DBoundingBoxData const & sABBox, A3DTess3D ** ppTess3D)
|
||||
{
|
||||
A3DStatus iRet = A3D_SUCCESS;
|
||||
|
||||
A3DTess3DData sTess3DData;
|
||||
A3D_INITIALIZE_DATA(A3DTess3DData, sTess3DData);
|
||||
|
||||
// Normal coordinates
|
||||
sTess3DData.m_uiNormalSize = 18;
|
||||
sTess3DData.m_pdNormals = static_cast<A3DDouble*>(malloc((size_t)sTess3DData.m_uiNormalSize * sizeof(A3DDouble)));
|
||||
for (A3DUns32 ui = 0; ui < sTess3DData.m_uiNormalSize; ++ui)
|
||||
sTess3DData.m_pdNormals[ui] = stCubeNormals[ui];
|
||||
|
||||
sTess3DData.m_uiTriangulatedIndexSize = 8 * 6;
|
||||
sTess3DData.m_puiTriangulatedIndexes = (A3DUns32*)malloc((size_t)sTess3DData.m_uiTriangulatedIndexSize * sizeof(A3DUns32));
|
||||
for (A3DUns32 ui = 0; ui < sTess3DData.m_uiTriangulatedIndexSize; ++ui)
|
||||
{
|
||||
sTess3DData.m_puiTriangulatedIndexes[ui] = stCubeFacesNormalPTriangles[ui];
|
||||
}
|
||||
|
||||
// Faces
|
||||
sTess3DData.m_bHasFaces = true;
|
||||
sTess3DData.m_uiFaceTessSize = 6;
|
||||
sTess3DData.m_psFaceTessData = static_cast<A3DTessFaceData*>(malloc((size_t)sTess3DData.m_uiFaceTessSize * sizeof(A3DTessFaceData)));
|
||||
for (A3DUns32 ui = 0; ui < sTess3DData.m_uiFaceTessSize; ++ui)
|
||||
{
|
||||
A3DTessFaceData& sFace = sTess3DData.m_psFaceTessData[ui];
|
||||
A3D_INITIALIZE_DATA(A3DTessFaceData, sFace);
|
||||
|
||||
sFace.m_usUsedEntitiesFlags = kA3DTessFaceDataTriangleOneNormal;
|
||||
sFace.m_uiStartTriangulated = ui * 8;
|
||||
|
||||
sFace.m_uiSizesTriangulatedSize = 1; // size of the next array
|
||||
sFace.m_puiSizesTriangulated = (A3DUns32*)malloc(sFace.m_uiSizesTriangulatedSize * A3DUns32(sizeof(A3DUns32)));
|
||||
sFace.m_puiSizesTriangulated[0] = 2; // number of triangles for this face
|
||||
}
|
||||
|
||||
iRet = A3DTess3DCreate(&sTess3DData, ppTess3D);
|
||||
freeTess3DData(sTess3DData);
|
||||
CHECK_RET(iRet);
|
||||
|
||||
A3DTessBaseData sTessBaseData;
|
||||
A3D_INITIALIZE_DATA(A3DTessBaseData, sTessBaseData);
|
||||
|
||||
sTessBaseData.m_bIsCalculated = false;
|
||||
|
||||
// Point coordinates
|
||||
sTessBaseData.m_uiCoordSize = 8 * 3;
|
||||
sTessBaseData.m_pdCoords = static_cast<A3DDouble*>(malloc((size_t)sTessBaseData.m_uiCoordSize * sizeof(A3DDouble)));
|
||||
|
||||
sTessBaseData.m_pdCoords[0] = sABBox.m_sMin.m_dX;
|
||||
sTessBaseData.m_pdCoords[1] = sABBox.m_sMin.m_dY;
|
||||
sTessBaseData.m_pdCoords[2] = sABBox.m_sMax.m_dZ;
|
||||
|
||||
sTessBaseData.m_pdCoords[3] = sABBox.m_sMax.m_dX;
|
||||
sTessBaseData.m_pdCoords[4] = sABBox.m_sMin.m_dY;
|
||||
sTessBaseData.m_pdCoords[5] = sABBox.m_sMax.m_dZ;
|
||||
|
||||
sTessBaseData.m_pdCoords[6] = sABBox.m_sMin.m_dX;
|
||||
sTessBaseData.m_pdCoords[7] = sABBox.m_sMax.m_dY;
|
||||
sTessBaseData.m_pdCoords[8] = sABBox.m_sMax.m_dZ;
|
||||
|
||||
sTessBaseData.m_pdCoords[9] = sABBox.m_sMax.m_dX;
|
||||
sTessBaseData.m_pdCoords[10] = sABBox.m_sMax.m_dY;
|
||||
sTessBaseData.m_pdCoords[11] = sABBox.m_sMax.m_dZ;
|
||||
|
||||
sTessBaseData.m_pdCoords[12] = sABBox.m_sMin.m_dX;
|
||||
sTessBaseData.m_pdCoords[13] = sABBox.m_sMax.m_dY;
|
||||
sTessBaseData.m_pdCoords[14] = sABBox.m_sMin.m_dZ;
|
||||
|
||||
|
||||
sTessBaseData.m_pdCoords[15] = sABBox.m_sMax.m_dX;
|
||||
sTessBaseData.m_pdCoords[16] = sABBox.m_sMax.m_dY;
|
||||
sTessBaseData.m_pdCoords[17] = sABBox.m_sMin.m_dZ;
|
||||
|
||||
sTessBaseData.m_pdCoords[18] = sABBox.m_sMin.m_dX;
|
||||
sTessBaseData.m_pdCoords[19] = sABBox.m_sMin.m_dY;
|
||||
sTessBaseData.m_pdCoords[20] = sABBox.m_sMin.m_dZ;
|
||||
|
||||
sTessBaseData.m_pdCoords[21] = sABBox.m_sMax.m_dX;
|
||||
sTessBaseData.m_pdCoords[22] = sABBox.m_sMin.m_dY;
|
||||
sTessBaseData.m_pdCoords[23] = sABBox.m_sMin.m_dZ;
|
||||
|
||||
iRet = A3DTessBaseSet(*ppTess3D, &sTessBaseData);
|
||||
free(sTessBaseData.m_pdCoords);
|
||||
|
||||
return iRet;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
static A3DStatus createPolyBrepModelFromA3DTess3D(A3DRiPolyBrepModel** ppPolyBREP, A3DTess3D* pTess3D)
|
||||
{
|
||||
A3DStatus iRet = A3D_SUCCESS;
|
||||
|
||||
A3DRiPolyBrepModelData sPolyBrepModelData;
|
||||
A3D_INITIALIZE_DATA(A3DRiPolyBrepModelData, sPolyBrepModelData);
|
||||
sPolyBrepModelData.m_bIsClosed = TRUE;
|
||||
CHECK_RET(A3DRiPolyBrepModelCreate(&sPolyBrepModelData, ppPolyBREP));
|
||||
|
||||
// assign the cube tessellation to the PolyBrepModel
|
||||
A3DRiRepresentationItemData sRiData;
|
||||
A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, sRiData);
|
||||
sRiData.m_pTessBase = pTess3D;
|
||||
sRiData.m_pCoordinateSystem = NULL;
|
||||
CHECK_RET(A3DRiRepresentationItemSet(*ppPolyBREP, &sRiData));
|
||||
|
||||
return iRet;
|
||||
}
|
||||
|
||||
//#####################################################################################################################
|
||||
// Create a A3DRiPolyBrepModel from a A3DBoundingBoxData with only triangles
|
||||
A3DStatus CreatePolyBrepModelFromABBox(A3DBoundingBoxData const & sABBox, A3DRiPolyBrepModel ** pRiPolyBrepModel)
|
||||
{
|
||||
A3DTess3D * pTess3D = nullptr;
|
||||
CHECK_RET(CreateA3DTess3DFromABBox(sABBox, &pTess3D));
|
||||
|
||||
CHECK_RET(createPolyBrepModelFromA3DTess3D(pRiPolyBrepModel, pTess3D));
|
||||
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
Reference in New Issue
Block a user