176 lines
6.7 KiB
C++
176 lines
6.7 KiB
C++
/***********************************************************************************************************************
|
|
*
|
|
* Copyright (c) 2010 - 2025 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;
|
|
}
|