Init
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
/***********************************************************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
***********************************************************************************************************************/
|
||||
/**
|
||||
* Sample CreatePRCCubes
|
||||
* file CreateTessellatedCubes.cpp
|
||||
* This file is containing the data and function used to create PRC Tessellation.
|
||||
*
|
||||
* fillCubeTessBaseData is filling the structure A3DTessBaseData
|
||||
* A3DTessBaseData is the structure containing the coordinates of the tessellation.
|
||||
*
|
||||
* fillCubeTessData is filling the structure A3DTess3DData
|
||||
* A3DTess3DData is the structure describing the coordinates from A3DTessBaseData
|
||||
* It contains indexes of vertex coordinates, wire frames coordinates, normals and textures coordinates.
|
||||
*
|
||||
*
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#include "CreateTessellatedCubes.h"
|
||||
|
||||
|
||||
//######################################################################################################################
|
||||
// Cube Tessellation structures completion
|
||||
// filling A3DTessBaseData: containing the coordinates of the tessellation.
|
||||
void fillCubeTessBaseData(A3DTessBaseData& sTessBaseData, A3DDouble cubeWidth, A3DDouble cubeHeight, A3DDouble cubeLength)
|
||||
{
|
||||
A3D_INITIALIZE_DATA(A3DTessBaseData, sTessBaseData);
|
||||
|
||||
sTessBaseData.m_bIsCalculated = false;
|
||||
|
||||
// Point coordinates
|
||||
sTessBaseData.m_uiCoordSize = 24;
|
||||
sTessBaseData.m_pdCoords = (A3DDouble*) malloc((size_t) sTessBaseData.m_uiCoordSize * sizeof(A3DDouble));
|
||||
|
||||
A3DUns32 ui;
|
||||
for (ui = 0; ui < sTessBaseData.m_uiCoordSize / 3; ++ui)
|
||||
{
|
||||
sTessBaseData.m_pdCoords[3 * ui] = stCubePoints[3 * ui] * cubeWidth;
|
||||
sTessBaseData.m_pdCoords[3 * ui + 1] = stCubePoints[3 * ui + 1] * cubeHeight;
|
||||
sTessBaseData.m_pdCoords[3 * ui + 2] = stCubePoints[3 * ui + 2] * cubeLength;
|
||||
}
|
||||
}
|
||||
|
||||
void freeTessBaseData(A3DTessBaseData& sTessBaseData)
|
||||
{
|
||||
free(sTessBaseData.m_pdCoords);
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
// Cube Tessellation structures completion
|
||||
// filling A3DTess3DData:describing the coordinates from A3DTessBaseData
|
||||
// indexes of vertex coordinates, wire frames coordinates, normals and textures coordinates.
|
||||
void fillCubeTessData(A3DTess3DData& sTess3DData, A3DUns32* puiStyleIndex)
|
||||
{
|
||||
A3D_INITIALIZE_DATA(A3DTess3DData, sTess3DData);
|
||||
|
||||
A3DUns32 ui;
|
||||
|
||||
// Normal coordinates
|
||||
sTess3DData.m_uiNormalSize = 18;
|
||||
sTess3DData.m_pdNormals = (A3DDouble*) malloc((size_t) sTess3DData.m_uiNormalSize * sizeof(A3DDouble));
|
||||
for (ui = 0; ui < sTess3DData.m_uiNormalSize; ++ui)
|
||||
sTess3DData.m_pdNormals[ui] = stCubeNormals[ui];
|
||||
|
||||
if (puiStyleIndex != NULL)
|
||||
{
|
||||
// UV coordinates
|
||||
sTess3DData.m_uiTextureCoordSize = 8;
|
||||
sTess3DData.m_pdTextureCoords =
|
||||
(A3DDouble*) malloc(sTess3DData.m_uiTextureCoordSize * A3DUns32(sizeof(A3DDouble)));
|
||||
for (ui = 0; ui < sTess3DData.m_uiTextureCoordSize; ++ui)
|
||||
{
|
||||
sTess3DData.m_pdTextureCoords[ui] = stCubeUV[ui];
|
||||
}
|
||||
}
|
||||
|
||||
// Faces
|
||||
sTess3DData.m_bHasFaces = true; // Geometrical face notion?
|
||||
sTess3DData.m_uiFaceTessSize = 6;
|
||||
sTess3DData.m_psFaceTessData =
|
||||
(A3DTessFaceData*) malloc((size_t) sTess3DData.m_uiFaceTessSize * sizeof(A3DTessFaceData));
|
||||
for (ui = 0; ui < sTess3DData.m_uiFaceTessSize; ++ui)
|
||||
A3D_INITIALIZE_DATA(A3DTessFaceData, (sTess3DData.m_psFaceTessData[ui]));
|
||||
|
||||
// All the point, normal and texture indexes are stored in the A3DTess3D.
|
||||
// The faces describes how to interpret these indices.
|
||||
if (puiStyleIndex != NULL)
|
||||
{
|
||||
sTess3DData.m_uiTriangulatedIndexSize = 18 * 6;
|
||||
sTess3DData.m_puiTriangulatedIndexes = (A3DUns32*) malloc(sTess3DData.m_uiTriangulatedIndexSize * A3DUns32(sizeof(A3DUns32)));
|
||||
for (ui = 0; ui < sTess3DData.m_uiTriangulatedIndexSize; ++ui)
|
||||
{
|
||||
sTess3DData.m_puiTriangulatedIndexes[ui] = stTexturedCubeFacesNormalPTrianglesUV[ui];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sTess3DData.m_uiTriangulatedIndexSize = 12 * 6;
|
||||
|
||||
sTess3DData.m_puiTriangulatedIndexes = (A3DUns32*) malloc((size_t) sTess3DData.m_uiTriangulatedIndexSize * sizeof(A3DUns32));
|
||||
for (ui = 0; ui < sTess3DData.m_uiTriangulatedIndexSize; ++ui)
|
||||
{
|
||||
sTess3DData.m_puiTriangulatedIndexes[ui] = stCubeFacesNormalPTrianglesUV[ui];
|
||||
}
|
||||
}
|
||||
|
||||
// Like above the edge point indices of the faces are stored in the A3DTess3D
|
||||
sTess3DData.m_uiWireIndexSize = 8 * 6;
|
||||
sTess3DData.m_puiWireIndexes = (A3DUns32*) malloc((size_t) sTess3DData.m_uiWireIndexSize * sizeof(A3DUns32));
|
||||
for (ui = 0; ui < sTess3DData.m_uiWireIndexSize; ++ui)
|
||||
sTess3DData.m_puiWireIndexes[ui] = stCubeFacesWireframe[ui];
|
||||
|
||||
A3DUns32 uj;
|
||||
for (ui = 0; ui < sTess3DData.m_uiFaceTessSize; ++ui)
|
||||
{
|
||||
A3DTessFaceData& sFace = sTess3DData.m_psFaceTessData[ui];
|
||||
|
||||
// Type(s) of the entities of the face. This face contains only triangles with texture (with uv for each vertex).
|
||||
if (puiStyleIndex != NULL)
|
||||
{
|
||||
sFace.m_usUsedEntitiesFlags = kA3DTessFaceDataTriangleTextured;
|
||||
// indicates the texture of this face
|
||||
if (*puiStyleIndex != A3D_DEFAULT_STYLE_INDEX)
|
||||
{
|
||||
sFace.m_uiStyleIndexesSize = 1;
|
||||
sFace.m_puiStyleIndexes = (A3DUns32*) malloc(sFace.m_uiStyleIndexesSize * A3DUns32(sizeof(A3DUns32)));
|
||||
sFace.m_puiStyleIndexes[0] = *puiStyleIndex;
|
||||
|
||||
}
|
||||
// number of uv indices for each vertex of the face
|
||||
// (a multi-textured face or a multi-referenced part should involve more than one uv index)
|
||||
sFace.m_uiTextureCoordIndexesSize = 1;
|
||||
// the description of the triangles of the face begins at this position
|
||||
// in the m_puiTriangulatedIndexes array filled above.
|
||||
sFace.m_uiStartTriangulated = ui * 18;
|
||||
}
|
||||
else
|
||||
{
|
||||
sFace.m_usUsedEntitiesFlags = kA3DTessFaceDataTriangle;
|
||||
sFace.m_uiTextureCoordIndexesSize = 0;
|
||||
sFace.m_uiStartTriangulated = ui * 12;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
// wireframe of the face
|
||||
sFace.m_uiSizesWiresSize = 4; // size of the next array corresponds to the number of edges
|
||||
sFace.m_puiSizesWires = (A3DUns32*) malloc((size_t) sFace.m_uiSizesWiresSize * sizeof(A3DUns32));
|
||||
for (uj = 0; uj < sFace.m_uiSizesWiresSize; ++uj)
|
||||
sFace.m_puiSizesWires[uj] = 2; // two points for each edge
|
||||
|
||||
// to indicate that the loop is closed,
|
||||
// the number of vertices of the last edge has the flag kA3DTessFaceDataWireIsClosing
|
||||
sFace.m_puiSizesWires[sFace.m_uiSizesWiresSize - 1] |= kA3DTessFaceDataWireIsClosing;
|
||||
|
||||
// the description of the wireframe of the face begins at this position
|
||||
// in the m_puiWireIndexes array filled above.
|
||||
sFace.m_uiStartWire = ui * 8;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void freeTess3DData(A3DTess3DData& sTess3DData)
|
||||
{
|
||||
free(sTess3DData.m_pdNormals);
|
||||
free(sTess3DData.m_pdTextureCoords);
|
||||
free(sTess3DData.m_puiTriangulatedIndexes);
|
||||
free(sTess3DData.m_puiWireIndexes);
|
||||
|
||||
A3DUns32 ui = sTess3DData.m_uiFaceTessSize;
|
||||
for (ui = 0; ui < sTess3DData.m_uiFaceTessSize; ++ui)
|
||||
{
|
||||
if (sTess3DData.m_psFaceTessData[ui].m_puiStyleIndexes != NULL) // Texture is optionnal
|
||||
free(sTess3DData.m_psFaceTessData[ui].m_puiStyleIndexes);
|
||||
free(sTess3DData.m_psFaceTessData[ui].m_puiSizesTriangulated);
|
||||
free(sTess3DData.m_psFaceTessData[ui].m_puiSizesWires);
|
||||
}
|
||||
free(sTess3DData.m_psFaceTessData);
|
||||
}
|
||||
Reference in New Issue
Block a user