Files
Hoops_Exchange/exchange/exchangesource/CreatePRCCubes/modules/CreateTextures.cpp
2025-12-15 22:06:49 +08:00

162 lines
7.1 KiB
C++

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