diff options
Diffstat (limited to 'libs/assimp/tools/assimp_view/AssetHelper.h')
-rw-r--r-- | libs/assimp/tools/assimp_view/AssetHelper.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/libs/assimp/tools/assimp_view/AssetHelper.h b/libs/assimp/tools/assimp_view/AssetHelper.h new file mode 100644 index 0000000..1ae469f --- /dev/null +++ b/libs/assimp/tools/assimp_view/AssetHelper.h @@ -0,0 +1,236 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2022, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#if (!defined AV_ASSET_HELPER_H_INCLUDED) +#define AV_ASSET_HELPER_H_INCLUDED + +#include <d3d9.h> +#include <d3dx9.h> +#include <d3dx9mesh.h> + +#include <assimp/scene.h> + +namespace AssimpView { + +class SceneAnimator; + +//------------------------------------------------------------------------------- +/** \brief Class to wrap ASSIMP's asset output structures + */ +//------------------------------------------------------------------------------- +class AssetHelper { +public: + enum { + // the original normal set will be used + ORIGINAL = 0x0u, + + // a smoothed normal set will be used + SMOOTH = 0x1u, + + // a hard normal set will be used + HARD = 0x2u, + }; + + // default constructor + AssetHelper() : + iNormalSet(ORIGINAL) { + mAnimator = NULL; + apcMeshes = NULL; + pcScene = NULL; + } + + //--------------------------------------------------------------- + // default vertex data structure + // (even if tangents, bitangents or normals aren't + // required by the shader they will be committed to the GPU) + //--------------------------------------------------------------- + struct Vertex { + aiVector3D vPosition; + aiVector3D vNormal; + + D3DCOLOR dColorDiffuse; + aiVector3D vTangent; + aiVector3D vBitangent; + aiVector2D vTextureUV; + aiVector2D vTextureUV2; + unsigned char mBoneIndices[4]; + unsigned char mBoneWeights[4]; // last Weight not used, calculated inside the vertex shader + + /** Returns the vertex declaration elements to create a declaration from. */ + static D3DVERTEXELEMENT9 *GetDeclarationElements() { + static D3DVERTEXELEMENT9 decl[] = { + { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, + { 0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + { 0, 28, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 }, + { 0, 40, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BINORMAL, 0 }, + { 0, 52, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 60, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 }, + { 0, 68, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 }, + { 0, 72, D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + D3DDECL_END() + }; + + return decl; + } + }; + + //--------------------------------------------------------------- + // FVF vertex structure used for normals + //--------------------------------------------------------------- + struct LineVertex { + aiVector3D vPosition; + DWORD dColorDiffuse; + + // retrieves the FVF code of the vertex type + static DWORD GetFVF() { + return D3DFVF_DIFFUSE | D3DFVF_XYZ; + } + }; + + //--------------------------------------------------------------- + // Helper class to store GPU related resources created for + // a given aiMesh + //--------------------------------------------------------------- + class MeshHelper { + public: + MeshHelper() : + eShadingMode(), + piVB(NULL), + piIB(NULL), + piVBNormals(NULL), + piEffect(NULL), + bSharedFX(false), + piDiffuseTexture(NULL), + piSpecularTexture(NULL), + piAmbientTexture(NULL), + piEmissiveTexture(NULL), + piNormalTexture(NULL), + piOpacityTexture(NULL), + piShininessTexture(NULL), + piLightmapTexture(NULL), + fOpacity(), + fShininess(), + fSpecularStrength(), + twosided(false), + pvOriginalNormals(NULL) {} + + ~MeshHelper() { + // NOTE: This is done in DeleteAssetData() + // TODO: Make this a proper d'tor + } + + // shading mode to use. Either Lambert or otherwise phong + // will be used in every case + aiShadingMode eShadingMode; + + // vertex buffer + IDirect3DVertexBuffer9 *piVB; + + // index buffer. For partially transparent meshes + // created with dynamic usage to be able to update + // the buffer contents quickly + IDirect3DIndexBuffer9 *piIB; + + // vertex buffer to be used to draw vertex normals + // (vertex normals are generated in every case) + IDirect3DVertexBuffer9 *piVBNormals; + + // shader to be used + ID3DXEffect *piEffect; + bool bSharedFX; + + // material textures + IDirect3DTexture9 *piDiffuseTexture; + IDirect3DTexture9 *piSpecularTexture; + IDirect3DTexture9 *piAmbientTexture; + IDirect3DTexture9 *piEmissiveTexture; + IDirect3DTexture9 *piNormalTexture; + IDirect3DTexture9 *piOpacityTexture; + IDirect3DTexture9 *piShininessTexture; + IDirect3DTexture9 *piLightmapTexture; + + // material colors + D3DXVECTOR4 vDiffuseColor; + D3DXVECTOR4 vSpecularColor; + D3DXVECTOR4 vAmbientColor; + D3DXVECTOR4 vEmissiveColor; + + // opacity for the material + float fOpacity; + + // shininess for the material + float fShininess; + + // strength of the specular highlight + float fSpecularStrength; + + // two-sided? + bool twosided; + + // Stores a pointer to the original normal set of the asset + aiVector3D *pvOriginalNormals; + }; + + // One instance per aiMesh in the globally loaded asset + MeshHelper **apcMeshes; + + // Scene wrapper instance + aiScene *pcScene; + + // Animation player to animate the scene if necessary + SceneAnimator *mAnimator; + + // Specifies the normal set to be used + unsigned int iNormalSet; + + // ------------------------------------------------------------------ + // set the normal set to be used + void SetNormalSet(unsigned int iSet); + + // ------------------------------------------------------------------ + // flip all normal vectors + void FlipNormals(); + void FlipNormalsInt(); +}; +} // namespace AssimpView + +#endif // !! IG |