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