/*********************************************************************************************************************** * * 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 wrapper/HXWBasicTessellation.cpp ***********************************************************************************************************************/ #include #include "HXWBasicTessellation.h" //###################################################################################################################### HXWBasicTessellation::HXWBasicTessellation() { A3D_INITIALIZE_DATA(A3DTessBaseData, m_coordsdata); m_coordsdata.m_pdCoords = NULL; m_coordsdata.m_uiCoordSize = m_uiCoordsAllocated = 0; } //###################################################################################################################### HXWBasicTessellation::~HXWBasicTessellation() { A3D_INITIALIZE_DATA(A3DTessBaseData, m_coordsdata); reset(); } //###################################################################################################################### void HXWBasicTessellation::reset() { free(m_coordsdata.m_pdCoords); m_coordsdata.m_pdCoords = NULL; m_coordsdata.m_uiCoordSize = m_uiCoordsAllocated = 0; } //###################################################################################################################### void HXWBasicTessellation::add_coords(A3DDouble* pdCoords, A3DUns32 uiCoordsSize) { if(m_uiCoordsAllocated == 0) { m_uiCoordsAllocated = ALLOCATION_STEP + uiCoordsSize; m_coordsdata.m_pdCoords = (A3DDouble*) malloc((size_t) m_uiCoordsAllocated * sizeof(A3DDouble)); } else if(!(uiCoordsSize + m_coordsdata.m_uiCoordSize < m_uiCoordsAllocated)) { m_uiCoordsAllocated = uiCoordsSize + m_coordsdata.m_uiCoordSize + ALLOCATION_STEP; A3DDouble* temp = (A3DDouble*) malloc((size_t) m_uiCoordsAllocated * sizeof(A3DDouble)); memcpy(temp, m_coordsdata.m_pdCoords, (size_t) m_coordsdata.m_uiCoordSize * sizeof(A3DDouble)); if(m_coordsdata.m_pdCoords != NULL) { free(m_coordsdata.m_pdCoords); m_coordsdata.m_pdCoords = NULL; } m_coordsdata.m_pdCoords = temp; } m_coordsdata.m_uiCoordSize += uiCoordsSize; for(unsigned i = 0 ; i < uiCoordsSize; ++i) m_coordsdata.m_pdCoords[m_coordsdata.m_uiCoordSize-uiCoordsSize+i] = pdCoords[i]; } //###################################################################################################################### void HXWBasicTessellation::add_coord(A3DDouble dCoord) { if(m_uiCoordsAllocated == 0) { m_coordsdata.m_pdCoords = (A3DDouble*) malloc(ALLOCATION_STEP * sizeof(A3DDouble)); m_uiCoordsAllocated = ALLOCATION_STEP; } else if(!(m_coordsdata.m_uiCoordSize + 1< m_uiCoordsAllocated)) { m_uiCoordsAllocated = m_coordsdata.m_uiCoordSize + ALLOCATION_STEP; A3DDouble* temp =(A3DDouble*) malloc((size_t) m_uiCoordsAllocated * sizeof(A3DDouble)); memcpy(temp, m_coordsdata.m_pdCoords, (size_t) m_coordsdata.m_uiCoordSize * sizeof(A3DDouble)); if(m_coordsdata.m_pdCoords != NULL) { free(m_coordsdata.m_pdCoords); m_coordsdata.m_pdCoords = NULL; } m_coordsdata.m_pdCoords = temp; } m_coordsdata.m_pdCoords[m_coordsdata.m_uiCoordSize++] = dCoord; } //###################################################################################################################### void HXWBasicTessellation::free_extra_coords() { if(m_coordsdata.m_uiCoordSize == m_uiCoordsAllocated) return; A3DDouble* pnew = NULL; if(m_coordsdata.m_uiCoordSize != 0) { pnew = (A3DDouble*) malloc((size_t) m_coordsdata.m_uiCoordSize * sizeof(A3DDouble)); memcpy(pnew, m_coordsdata.m_pdCoords, (size_t) m_coordsdata.m_uiCoordSize * sizeof(A3DDouble)); } if(m_coordsdata.m_pdCoords != NULL) { free(m_coordsdata.m_pdCoords); m_coordsdata.m_pdCoords = NULL; } m_coordsdata.m_pdCoords = pnew; m_uiCoordsAllocated = m_coordsdata.m_uiCoordSize; }