Files
Hoops_Exchange/exchange/exchangesource/Collision/createtessellatedbox.cpp
2025-12-15 22:06:49 +08:00

176 lines
6.7 KiB
C++

/***********************************************************************************************************************
*
* 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;
}