/*********************************************************************************************************************** * * 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 TessConnector.cpp This file provide tools to get the Tessellation of Cad Models ***********************************************************************************************************************/ #include "../TessConnector.h" #include "../VisitorContainer.h" #include //////////////////////////////////////// // A3DTessDataConnector /////////////////////////////////////// A3DTessDataConnector::A3DTessDataConnector(const A3DTess3D* pTess3D) : A3DConnector(pTess3D) { A3D_INITIALIZE_DATA(A3DTess3DData, m_sTessData); CALL_A3D_FCTION(A3DTess3DGet,( pTess3D, &m_sTessData)); A3D_INITIALIZE_DATA(A3DTessBaseData, m_sBaseTessData); CALL_A3D_FCTION(A3DTessBaseGet,((const A3DTessBase*) pTess3D,&m_sBaseTessData)); } A3DTessDataConnector::~A3DTessDataConnector() { CALL_A3D_FCTION(A3DTess3DGet,( NULL, &m_sTessData)); CALL_A3D_FCTION(A3DTessBaseGet,(NULL, &m_sBaseTessData)); } A3DStatus A3DTessDataConnector::Traverse(A3DVisitorContainer* psVisitor) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); unsigned uNbFaces = FacesSize(); for (unsigned uFace = 0; uFace < uNbFaces; uFace++) { A3DFaceTessDataConnector sFaceConnector(&m_sTessData.m_psFaceTessData[uFace], uFace, this); sFaceConnector.Traverse(psVisitor); } CHECK_RET(psVisitor->visitLeave(*this)); return A3D_SUCCESS; } // Retrieve all the point of the Tess3DData A3DStatus A3DTessDataConnector::Points(double*& pPoint, unsigned int& uSize) const { pPoint = m_sBaseTessData.m_pdCoords; uSize = m_sBaseTessData.m_uiCoordSize; return A3D_SUCCESS; } // Retrieve all the normals of the Tess3DData A3DStatus A3DTessDataConnector::Normals(double*& pNormal, unsigned int& uSize) const { pNormal = m_sTessData.m_pdNormals; uSize = m_sTessData.m_uiNormalSize; return A3D_SUCCESS; } // Retrieve all the textures of the Tess3DData A3DStatus A3DTessDataConnector::UV(double*& pUV, unsigned int& uSize) const { pUV = m_sTessData.m_pdTextureCoords; uSize = m_sTessData.m_uiTextureCoordSize; return A3D_SUCCESS; } #define COPY(dest,src,size_) if(size_ != 0) {\ size_t uTempSize = dest.size();\ dest.resize(uTempSize + size_);\ std::copy(src ,src+ size_, dest.begin() + uTempSize);\ src+= size_; \ size_ = 0;\ } #define COPY_(dest,src,size_) /*if(size_)*/ {\ size_t uTempSize = dest.size();\ dest.resize(uTempSize + size_);\ std::copy(src,src+size_, dest.begin() + uTempSize);\ } // Retrieve the index as triangle for each Face of the Tess3DData A3DStatus A3DTessDataConnector::IndicesAsTriangle( std::vector& auTriangleWithPoint_Normals, std::vector& auTriangleWithPoint_Normals_UV_Indices) const { A3DStatus iRet = A3D_SUCCESS; unsigned uFaceCount, uFaceSize = m_sTessData.m_uiFaceTessSize; for (uFaceCount = 0; uFaceCount < uFaceSize; uFaceCount++) { CHECK_RET(IndicesPerFaceAsTriangle( uFaceCount, auTriangleWithPoint_Normals, auTriangleWithPoint_Normals_UV_Indices)); } return A3D_SUCCESS; } // Retrieve the index as triangle per face of the Tess3DData A3DStatus A3DTessDataConnector::IndicesPerFaceAsTriangle( const unsigned& uFaceIndice, std::vector& auTriangleWithPoint_Normals_Indices, std::vector& auTriangleWithPoint_Normals_UV_Indices) const { A3DTessFaceData* pFaceTessData = &(m_sTessData.m_psFaceTessData[uFaceIndice]); if (!pFaceTessData->m_uiSizesTriangulatedSize) return A3D_SUCCESS; A3DUns32* puiTriangulatedIndexes = m_sTessData.m_puiTriangulatedIndexes + pFaceTessData->m_uiStartTriangulated; unsigned uiCurrentSize = 0; // Triangle One Normal Per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangle) { unsigned uiNbIndice = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 6; COPY(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, uiNbIndice); } // Fan One Normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFan) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 2; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; } } // stripe One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripe) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; puiTriangulatedIndexes += 2; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); } else { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); } puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; } } //Triangle one Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormal) { A3DUns32 uNbTriangles = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]/* & kA3DTessFaceDataNormalMask*/; for (A3DUns32 uI = 0; uI < uNbTriangles; uI++) { A3DUns32* pNormalIndice = puiTriangulatedIndexes; COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); puiTriangulatedIndexes += 2; COPY_(auTriangleWithPoint_Normals_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); puiTriangulatedIndexes += 1; COPY_(auTriangleWithPoint_Normals_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); puiTriangulatedIndexes += 1; } } // Fan One normal per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormal) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 2; for (A3DUns32 uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 2); COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 1, 1); puiTriangulatedIndexes += 1; } puiTriangulatedIndexes++; } } // Stripe One normal per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormal) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; A3DUns32* pStripeNormalIndice = puiTriangulatedIndexes; A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; puiTriangulatedIndexes += 2; // Is there only one normal for the entire stripe? if (bIsOneNormal == false) { A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); } else { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); } puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; continue; } A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 1, 1); COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 1, 1); } else { COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 1, 1); COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 1, 1); } puiTriangulatedIndexes += 1; } puiTriangulatedIndexes += 1; } } // Textured triangle One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleTextured) { unsigned uiNbIndice = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * (6 + 3 * pFaceTessData->m_uiTextureCoordIndexesSize); COPY(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, uiNbIndice); } // Textured Fan One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 3; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); puiTriangulatedIndexes += 3; } puiTriangulatedIndexes += 3; } } //Textured Stripe One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; puiTriangulatedIndexes += 3; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 3, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); } else { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 3, 3); } puiTriangulatedIndexes += 3; } puiTriangulatedIndexes += 3; } } // Textured One normal per Triangle if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormalTextured) { A3DUns32 uNbTriangles = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uI = 0; uI < uNbTriangles; uI++) { A3DUns32* pNormalIndice = puiTriangulatedIndexes; COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); puiTriangulatedIndexes += 3; COPY_(auTriangleWithPoint_Normals_UV_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); puiTriangulatedIndexes += 2; COPY_(auTriangleWithPoint_Normals_UV_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); puiTriangulatedIndexes += 2; } } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormalTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 2; for (A3DUns32 uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 2, 2); puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; } } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormalTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } A3DUns32* pStripeNormalIndice = puiTriangulatedIndexes; A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; puiTriangulatedIndexes += 3; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 2, 2); COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 2, 2); } else { COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 2, 2); COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 2, 2); } puiTriangulatedIndexes += 2; } } } return A3D_SUCCESS; } A3DStatus A3DTessDataConnector::IndicesPerFace( const unsigned& uFaceIndice, std::vector& /*auTrianglesOneNormal*/, //(normal, point, point,..., point) std::vector& /*auFanOneNormal*/, std::vector& /*auStripeOneNormal*/, std::vector& auTrianglesWithNormals, //normal, point, ... , normal, point std::vector& auFanWithNormals, std::vector& auStripeWithNormal, std::vector& /*auTrianglesOneNormalTexture*/, //normal,{texture...},point,{texture...},point,{texture...},point std::vector& /*auFanOneNormalTextured*/, std::vector& /*auStripeOneNormalTextured*/, std::vector& /*auTrianglesWithNormalsTextured*/, //normal,{texture...},point,...,normal,{texture...},point std::vector& /*auFanWithNormalsTextured*/, std::vector& /*auStripeWithNormalsTextured*/) const { A3DTessFaceData* pFaceTessData = &(m_sTessData.m_psFaceTessData[uFaceIndice]); if (!pFaceTessData->m_uiSizesTriangulatedSize) return A3D_SUCCESS; A3DUns32 uiCurrentSize = 0; A3DUns32* puiTriangulatedIndexes = m_sTessData.m_puiTriangulatedIndexes + pFaceTessData->m_uiStartTriangulated; A3DUns32 uiNbIndice = 0; // One Normal Per Vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangle) { uiNbIndice = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 6; COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFan) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 2; COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripe) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 2; COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } //One Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormal) { uiNbIndice = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]/* & kA3DTessFaceDataNormalMask*/) * 4; } COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormal) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] + 1; } COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormal) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] + 1; } COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } // Textured //One Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleTextured) uiNbIndice = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 9; COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 3; COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 3; COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } // Textured //One Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormalTextured) { uiNbIndice = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]/* & kA3DTessFaceDataNormalMask*/) * 7; } COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormalTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask) * 2 + 1; } COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormalTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask) * 2 + 1; } COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } return A3D_SUCCESS; } A3DStatus A3DTessDataConnector::Indices( std::vector& auTrianglesOneNormal, //(normal, point, point,..., point) std::vector& auFanOneNormal, std::vector& auStripeOneNormal, std::vector& auTrianglesWithNormals, //normal, point, ... , normal, point std::vector& auFanWithNormals, std::vector& auStripeWithNormal, std::vector& auTrianglesOneNormalTexture, //normal,{texture...},point,{texture...},point,{texture...},point std::vector& auFanOneNormalTextured, std::vector& auStripeOneNormalTextured, std::vector& auTrianglesWithNormalsTextured, //normal,{texture...},point,...,normal,{texture...},point std::vector& auFanWithNormalsTextured, std::vector& auStripeWithNormalsTextured) const { A3DStatus iRet = A3D_SUCCESS; unsigned uFaceCount, uFaceSize = m_sTessData.m_uiFaceTessSize; for (uFaceCount = 0; uFaceCount < uFaceSize; uFaceCount++) CHECK_RET(IndicesPerFace( uFaceCount, auTrianglesOneNormal, auFanOneNormal, auStripeOneNormal, auTrianglesWithNormals, auFanWithNormals, auStripeWithNormal, auTrianglesOneNormalTexture, auFanOneNormalTextured, auStripeOneNormalTextured, auTrianglesWithNormalsTextured, auFanWithNormalsTextured, auStripeWithNormalsTextured)); return A3D_SUCCESS; } //////////////////////////////////////// // A3DFaceTessDataConnector /////////////////////////////////////// A3DFaceTessDataConnector::A3DFaceTessDataConnector(const A3DTessFaceData* pFaceTess3D, unsigned uCurrentFaceIndex, const A3DTessDataConnector* pTessConnector) : A3DConnector(pFaceTess3D), m_pTessConnector(pTessConnector), m_uCurrentFaceIndex(uCurrentFaceIndex) { } A3DFaceTessDataConnector::~A3DFaceTessDataConnector() { } A3DStatus A3DFaceTessDataConnector::Traverse(A3DVisitorContainer* psVisitor) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); CHECK_RET(psVisitor->visitLeave(*this)); return A3D_SUCCESS; } A3DStatus A3DFaceTessDataConnector::IndicesAsTriangle( std::vector& auTriangleWithPoint_Normals_Indices, std::vector& auTriangleWithPoint_Normals_UV_Indices) const { A3DTessFaceData* pFaceTessData = (A3DTessFaceData*)this->GetA3DEntity(); if (!pFaceTessData->m_uiSizesTriangulatedSize) return A3D_SUCCESS; A3DUns32* puiTriangulatedIndexes = m_pTessConnector->GetTess3DData()->m_puiTriangulatedIndexes + pFaceTessData->m_uiStartTriangulated; unsigned uiCurrentSize = 0; // Triangle One Normal Per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangle) { unsigned uiNbIndice = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]) * 6; COPY(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, uiNbIndice); puiTriangulatedIndexes += uiNbIndice; } // Fan One Normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFan) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 2; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; } } // stripe One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripe) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; puiTriangulatedIndexes += 2; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); } else { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); } puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; } } //Triangle one Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormal) { A3DUns32 uNbTriangles = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]/* & kA3DTessFaceDataNormalMask*/; for (A3DUns32 uI = 0; uI < uNbTriangles; uI++) { A3DUns32* pNormalIndice = puiTriangulatedIndexes; COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); puiTriangulatedIndexes += 2; COPY_(auTriangleWithPoint_Normals_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); puiTriangulatedIndexes += 1; COPY_(auTriangleWithPoint_Normals_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); puiTriangulatedIndexes += 1; } } // Fan One normal per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormal) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 1; if (bIsOneNormal == false) { A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; continue; } A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 1; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 2); COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); COPY_(auTriangleWithPoint_Normals_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 1, 1); puiTriangulatedIndexes += 1; } puiTriangulatedIndexes += 1; } } // Stripe One normal per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormal) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; A3DUns32* pStripeNormalIndice = puiTriangulatedIndexes; A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; puiTriangulatedIndexes += 2; if (bIsOneNormal == false) { A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 2); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); } else { COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 2, 2); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 2, 2); } puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; continue; } A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes, 1); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 1, 1); COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 1, 1); } else { COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes + 1, 1); COPY_(auTriangleWithPoint_Normals_Indices, pStripeNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_Indices, puiTriangulatedIndexes - 1, 1); } puiTriangulatedIndexes += 1; } puiTriangulatedIndexes += 1; } } // Textured triangle One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleTextured) { unsigned uiNbIndice = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 9; COPY(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, uiNbIndice); puiTriangulatedIndexes += uiNbIndice; } // Textured Fan One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 3; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); puiTriangulatedIndexes += 3; } puiTriangulatedIndexes += 3; } } //Textured Stripe One normal per vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; puiTriangulatedIndexes += 3; A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 3, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); } else { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 3, 3); } puiTriangulatedIndexes += 3; } puiTriangulatedIndexes += 3; } } // Textured One normal per Triangle if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormalTextured) { A3DUns32 uNbTriangles = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uI = 0; uI < uNbTriangles; uI++) { A3DUns32* pNormalIndice = puiTriangulatedIndexes; COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); puiTriangulatedIndexes += 3; COPY_(auTriangleWithPoint_Normals_UV_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); puiTriangulatedIndexes += 2; COPY_(auTriangleWithPoint_Normals_UV_Indices, pNormalIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); puiTriangulatedIndexes += 2; } } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormalTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32* pFanPointIndice = puiTriangulatedIndexes; puiTriangulatedIndexes += 2; if (bIsOneNormal == false) { A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); puiTriangulatedIndexes += 3; } puiTriangulatedIndexes += 3; continue; } for (A3DUns32 uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); COPY_(auTriangleWithPoint_Normals_UV_Indices, pFanPointIndice, 1); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 2, 2); puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; } } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormalTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; A3DUns32* pStripeNormalIndice = puiTriangulatedIndexes; A3DUns32 uiNbPoint = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; puiTriangulatedIndexes += 3; if (bIsOneNormal == false) { A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 3); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 3, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); } else { COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 3, 3); COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 3, 3); } puiTriangulatedIndexes += 3; } puiTriangulatedIndexes += 3; continue; } A3DUns32 uIPoint; for (uIPoint = 0; uIPoint < uiNbPoint - 2; uIPoint++) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes, 2); if (uIPoint % 2) { COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 2, 2); COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 2, 2); } else { COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes + 2, 2); COPY_(auTriangleWithPoint_Normals_UV_Indices, pStripeNormalIndice, 1) COPY_(auTriangleWithPoint_Normals_UV_Indices, puiTriangulatedIndexes - 2, 2); } puiTriangulatedIndexes += 2; } puiTriangulatedIndexes += 2; } } return A3D_SUCCESS; } A3DStatus A3DFaceTessDataConnector::Indices( std::vector& /*auTrianglesOneNormal*/, //(normal, point, point,..., point) std::vector& /*auFanOneNormal*/, std::vector& /*auStripeOneNormal*/, std::vector& auTrianglesWithNormals, //normal, point, ... , normal, point std::vector& auFanWithNormals, std::vector& auStripeWithNormal, std::vector& /*auTrianglesOneNormalTexture*/, //normal,{texture...},point,{texture...},point,{texture...},point std::vector& /*auFanOneNormalTextured*/, std::vector& /*auStripeOneNormalTextured*/, std::vector& /*auTrianglesWithNormalsTextured*/, //normal,{texture...},point,...,normal,{texture...},point std::vector& /*auFanWithNormalsTextured*/, std::vector& /*auStripeWithNormalsTextured*/) const { A3DTessFaceData* pFaceTessData = (A3DTessFaceData*)this->GetA3DEntity(); if (!pFaceTessData->m_uiSizesTriangulatedSize) return A3D_SUCCESS; A3DUns32 uiCurrentSize = 0; A3DUns32* puiTriangulatedIndexes = m_pTessConnector->GetTess3DData()->m_puiTriangulatedIndexes + pFaceTessData->m_uiStartTriangulated; A3DUns32 uiNbIndice = 0; // One Normal Per Vertex if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangle) { uiNbIndice = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 6; COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFan) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 2; COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripe) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 2; COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } //One Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormal) { // bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; // if(bIsOneNormal == false) // { // return A3D_ERROR; // } uiNbIndice = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]/* & kA3DTessFaceDataNormalMask*/) * 4; } COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormal) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask) + 1; } COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormal) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] + 1; } COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } // Textured //One Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleTextured) uiNbIndice = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 9; COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 3; COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) uiNbIndice += pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] * 3; COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } // Textured //One Normal Per entity if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormalTextured) { uiNbIndice = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++]/* & kA3DTessFaceDataNormalMask*/) * 7; } COPY(auTrianglesWithNormals, puiTriangulatedIndexes, uiNbIndice); if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormalTextured) { A3DUns32 uiNbFan = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; for (A3DUns32 uiFan = 0; uiFan < uiNbFan; uiFan++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask) * 2 + 1; } COPY(auFanWithNormals, puiTriangulatedIndexes, uiNbIndice); } if (pFaceTessData->m_usUsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormalTextured) { A3DUns32 uiNbStripe = pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask; A3DUns32 uiStripe; for (uiStripe = 0; uiStripe < uiNbStripe; uiStripe++) { bool bIsOneNormal = (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize] & kA3DTessFaceDataNormalSingle) != 0; if (bIsOneNormal == false) { return A3D_ERROR; } uiNbIndice += (pFaceTessData->m_puiSizesTriangulated[uiCurrentSize++] & kA3DTessFaceDataNormalMask) * 2 + 1; } COPY(auStripeWithNormal, puiTriangulatedIndexes, uiNbIndice); } return A3D_SUCCESS; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //A3DWireTessDataConnector ///////////////////////////////////////////////////////////////////////////////////////////////////////////// A3DWireTessDataConnector::A3DWireTessDataConnector(const A3DTess3DWire* psTessWire) { A3D_INITIALIZE_DATA(A3DTess3DWireData, m_sWire3DTessData); A3DTess3DWireGet(psTessWire, &m_sWire3DTessData); A3D_INITIALIZE_DATA(A3DTessBaseData, m_sBaseTessData); A3DTessBaseGet((const A3DTessBase*)psTessWire, &m_sBaseTessData); } A3DWireTessDataConnector::~A3DWireTessDataConnector() { A3DTess3DWireGet(NULL, &m_sWire3DTessData); A3DTessBaseGet(NULL, &m_sBaseTessData); } A3DStatus A3DWireTessDataConnector::Points(double*& pPoint, unsigned int& uSize) const { pPoint = m_sBaseTessData.m_pdCoords; uSize = m_sBaseTessData.m_uiCoordSize; return A3D_SUCCESS; } A3DStatus A3DWireTessDataConnector::Indices(std::vector& auPolylineIndices) const { if (!m_sWire3DTessData.m_uiSizesWiresSize) { if (m_sBaseTessData.m_uiCoordSize) { auPolylineIndices.push_back(0); auPolylineIndices.push_back(m_sBaseTessData.m_uiCoordSize / 3); } return A3D_SUCCESS; } for (unsigned uI = 0; uI < m_sWire3DTessData.m_uiSizesWiresSize;uI++) { auPolylineIndices.push_back(m_sWire3DTessData.m_puiSizesWires[uI]); } return A3D_SUCCESS; } A3DStatus A3DWireTessDataConnector::Traverse(A3DVisitorContainer* psVisitor) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); CHECK_RET(psVisitor->visitLeave(*this)); return A3D_SUCCESS; } A3DStatus A3DTessDataConnector::GetTextureCount(const unsigned& uFaceIndice, unsigned& uCount) const { A3DTessFaceData* pFaceTessData = &(m_sTessData.m_psFaceTessData[uFaceIndice]); uCount = pFaceTessData->m_uiTextureCoordIndexesSize; return A3D_SUCCESS; }