162 lines
7.1 KiB
C++
162 lines
7.1 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.
|
|
*
|
|
***********************************************************************************************************************/
|
|
/**
|
|
* Sample CreatePRCCubes
|
|
* file CreateTextures.cpp
|
|
* This file is containing the function allowing to create Textures.
|
|
*
|
|
* Texture creation exemple
|
|
* Create the style corresponding to texture.
|
|
*
|
|
*
|
|
***********************************************************************************************************************/
|
|
#include "CreateTextures.h"
|
|
|
|
#ifdef WIN32
|
|
# include <sys/stat.h>
|
|
#else
|
|
# include <sys/types.h> /* stat */
|
|
# include <sys/stat.h>
|
|
# include <unistd.h>
|
|
#endif
|
|
|
|
//######################################################################################################################
|
|
// Picture creation
|
|
static A3DStatus stFillBinaryDataWithFile(const A3DUTF8Char* pcPictureFilePath, A3DUns8*& pcBinaryData, A3DUns32& iFileSize)
|
|
{
|
|
A3DStatus iRet = A3D_SUCCESS;
|
|
FILE* psFile = fopen(pcPictureFilePath, "rb");
|
|
if(psFile == NULL)
|
|
return A3D_ERROR;
|
|
|
|
#ifdef WIN32
|
|
struct _stat ficstat;
|
|
iRet = (A3DStatus) _stat(pcPictureFilePath, &ficstat);
|
|
#else
|
|
struct stat ficstat;
|
|
# if defined(Apple) && defined(_UNICODE)
|
|
USES_CONVERSION;
|
|
iRet = (stat(W2A(pcPictureFilePath), &ficstat) == 0 ? A3D_SUCCESS : A3D_ERROR);
|
|
# else
|
|
iRet = (stat(pcPictureFilePath, &ficstat) == 0 ? A3D_SUCCESS : A3D_ERROR);
|
|
# endif
|
|
#endif
|
|
if (iRet != A3D_SUCCESS || ficstat.st_size == 0)
|
|
{
|
|
fclose(psFile);
|
|
return A3D_ERROR;
|
|
}
|
|
|
|
iFileSize = ficstat.st_size;
|
|
pcBinaryData = (A3DUns8*)malloc(iFileSize * A3DUns32(sizeof(A3DUns8)));
|
|
fread(pcBinaryData, sizeof(unsigned char), size_t(iFileSize), psFile);
|
|
fclose(psFile);
|
|
return A3D_SUCCESS;
|
|
}
|
|
|
|
//######################################################################################################################
|
|
static A3DStatus stCreatePicture(const A3DUTF8Char* pcPictureFilePath, A3DEPictureDataFormat eFormat,
|
|
A3DUns32 uiPixelHeight, A3DUns32 uiPixelWidth, A3DUns32& uiPictureIndex)
|
|
{
|
|
A3DStatus iRet = A3D_SUCCESS;
|
|
|
|
// For supported PRC image type, the sizes should be 0 as they are stored in the data
|
|
A3DGraphPictureData sPictureData;
|
|
A3D_INITIALIZE_DATA(A3DGraphPictureData, sPictureData);
|
|
sPictureData.m_eFormat = eFormat;
|
|
sPictureData.m_uiPixelHeight = uiPixelHeight;
|
|
sPictureData.m_uiPixelWidth = uiPixelWidth;
|
|
CHECK_RET(stFillBinaryDataWithFile(pcPictureFilePath, sPictureData.m_pucBinaryData, sPictureData.m_uiSize));
|
|
|
|
CHECK_RET(A3DGlobalInsertGraphPicture(&sPictureData, &uiPictureIndex));
|
|
free(sPictureData.m_pucBinaryData);
|
|
|
|
return iRet;
|
|
}
|
|
|
|
//######################################################################################################################
|
|
// Texture creation
|
|
A3DStatus createTexture(const A3DUTF8Char* pcPictureFilePath, A3DEPictureDataFormat eFormat, A3DUns32 uiPixelHeight, A3DUns32 uiPixelWidth, A3DUns32& uiStyleIndex)
|
|
{
|
|
A3DStatus iRet = A3D_SUCCESS;
|
|
|
|
A3DUns32 uiPictureIndex;
|
|
CHECK_RET(stCreatePicture(pcPictureFilePath, eFormat, uiPixelHeight, uiPixelWidth, uiPictureIndex));
|
|
|
|
A3DUns32 uiMaterialGenericIndex;
|
|
CHECK_RET(createMaterial(uiMaterialGenericIndex, DARK_GREY));
|
|
|
|
A3DGraphTextureDefinitionData sTextureDefinitionData;
|
|
A3D_INITIALIZE_DATA(A3DGraphTextureDefinitionData, sTextureDefinitionData);
|
|
sTextureDefinitionData.m_uiMappingAttributes = kA3DTextureMappingDiffuse;
|
|
sTextureDefinitionData.m_ucTextureDimension = 2;
|
|
sTextureDefinitionData.m_eMappingType = kA3DTextureMappingTypeStored;
|
|
sTextureDefinitionData.m_eMappingOperator = kA3DTextureMappingOperatorUnknown;
|
|
sTextureDefinitionData.m_uiPictureIndex = uiPictureIndex;
|
|
sTextureDefinitionData.m_eTextureWrappingModeS = kA3DTextureWrappingModeClampToBorder;
|
|
sTextureDefinitionData.m_eTextureWrappingModeT = kA3DTextureWrappingModeClampToBorder;
|
|
sTextureDefinitionData.m_eTextureFunction = kA3DTextureFunctionModulate;
|
|
sTextureDefinitionData.m_dRed = 0.0;
|
|
sTextureDefinitionData.m_dGreen = 0.0;
|
|
sTextureDefinitionData.m_dBlue = 0.0;
|
|
sTextureDefinitionData.m_dAlpha = 0.0;
|
|
sTextureDefinitionData.m_eBlend_src_RGB = kA3DTextureBlendParameterUnknown;
|
|
sTextureDefinitionData.m_eBlend_dst_RGB = kA3DTextureBlendParameterUnknown;
|
|
sTextureDefinitionData.m_eBlend_src_Alpha = kA3DTextureBlendParameterUnknown;
|
|
sTextureDefinitionData.m_eBlend_dst_Alpha = kA3DTextureBlendParameterUnknown;
|
|
|
|
sTextureDefinitionData.m_ucTextureApplyingMode = kA3DTextureApplyingModeNone;
|
|
sTextureDefinitionData.m_eTextureAlphaTest = kA3DTextureAlphaTestUnknown;
|
|
sTextureDefinitionData.m_dAlphaTestReference = 0.0;
|
|
|
|
A3DUns32 uiIndexTextureDefinition;
|
|
CHECK_RET(A3DGlobalInsertGraphTextureDefinition(&sTextureDefinitionData, &uiIndexTextureDefinition));
|
|
free(sTextureDefinitionData.m_pdMappingAttributesIntensity);
|
|
CHECK_RET(iRet);
|
|
|
|
A3DGraphTextureApplicationData sTextureApplicationData;
|
|
A3D_INITIALIZE_DATA(A3DGraphTextureApplicationData, sTextureApplicationData);
|
|
sTextureApplicationData.m_uiMaterialIndex = uiMaterialGenericIndex;
|
|
sTextureApplicationData.m_uiTextureDefinitionIndex = uiIndexTextureDefinition;
|
|
sTextureApplicationData.m_iUVCoordinatesIndex = 0;
|
|
sTextureApplicationData.m_uiNextTextureApplicationIndex = A3D_DEFAULT_MATERIAL_INDEX;
|
|
|
|
A3DUns32 uiTextureApplicationIndex;
|
|
CHECK_RET(A3DGlobalInsertGraphTextureApplication(&sTextureApplicationData, &uiTextureApplicationIndex));
|
|
|
|
// LinePattern is mandatory
|
|
A3DUns32 uiLinePatternIndex;
|
|
A3DGraphLinePatternData sLinePatternData;
|
|
A3D_INITIALIZE_DATA(A3DGraphLinePatternData, sLinePatternData);
|
|
sLinePatternData.m_uiNumberOfLengths = 2;
|
|
sLinePatternData.m_pdLengths =
|
|
(A3DDouble*)malloc(sLinePatternData.m_uiNumberOfLengths * A3DUns32(sizeof(A3DDouble)));
|
|
sLinePatternData.m_pdLengths[0] = 10000.0;
|
|
sLinePatternData.m_pdLengths[1] = 0.0;
|
|
sLinePatternData.m_dPhase = 0.0;
|
|
sLinePatternData.m_bRealLength = true;
|
|
CHECK_RET(A3DGlobalInsertGraphLinePattern(&sLinePatternData, &uiLinePatternIndex));
|
|
free(sLinePatternData.m_pdLengths);
|
|
CHECK_RET(iRet);
|
|
|
|
A3DGraphStyleData sStyleData;
|
|
A3D_INITIALIZE_DATA(A3DGraphStyleData, sStyleData);
|
|
sStyleData.m_bMaterial = true;
|
|
sStyleData.m_bVPicture = false;
|
|
sStyleData.m_dWidth = 0.1; // default
|
|
sStyleData.m_ucTransparency = 255;
|
|
sStyleData.m_uiLinePatternIndex = uiLinePatternIndex;
|
|
sStyleData.m_uiRgbColorIndex = uiTextureApplicationIndex;
|
|
CHECK_RET(A3DGlobalInsertGraphStyle(&sStyleData, &uiStyleIndex));
|
|
|
|
return iRet;
|
|
}
|