/*********************************************************************************************************************** * * 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 #else # include /* stat */ # include # include #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; }