summaryrefslogtreecommitdiff
path: root/libs/assimp/tools/assimp_view/Display.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/assimp/tools/assimp_view/Display.h')
-rw-r--r--libs/assimp/tools/assimp_view/Display.h542
1 files changed, 542 insertions, 0 deletions
diff --git a/libs/assimp/tools/assimp_view/Display.h b/libs/assimp/tools/assimp_view/Display.h
new file mode 100644
index 0000000..1ca29f4
--- /dev/null
+++ b/libs/assimp/tools/assimp_view/Display.h
@@ -0,0 +1,542 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, 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_DISPLAY_H_INCLUDED)
+#define AV_DISPLAY_H_INCLUDE
+
+#include <windows.h>
+#include <shellapi.h>
+#include <commctrl.h>
+
+// see CDisplay::m_aiImageList
+#define AI_VIEW_IMGLIST_NODE 0x0
+#define AI_VIEW_IMGLIST_MATERIAL 0x1
+#define AI_VIEW_IMGLIST_TEXTURE 0x2
+#define AI_VIEW_IMGLIST_TEXTURE_INVALID 0x3
+#define AI_VIEW_IMGLIST_MODEL 0x4
+
+namespace AssimpView
+{
+
+ //-------------------------------------------------------------------------------
+ /* Corresponds to the "Display" combobox in the UI
+ */
+ //-------------------------------------------------------------------------------
+ class CDisplay
+ {
+ private:
+
+ // helper class
+ struct Info
+ {
+ Info( D3DXVECTOR4* p1,
+ AssetHelper::MeshHelper* p2,
+ const char* p3 )
+ : pclrColor( p1 ), pMesh( p2 ), szShaderParam( p3 ) {}
+
+ D3DXVECTOR4* pclrColor;
+ AssetHelper::MeshHelper* pMesh;
+ const char* szShaderParam;
+ };
+
+ // default constructor
+ CDisplay()
+ : m_iViewMode( VIEWMODE_FULL ),
+ m_pcCurrentTexture( NULL ),
+ m_pcCurrentNode( NULL ),
+ m_pcCurrentMaterial( NULL ),
+ m_hImageList( NULL ),
+ m_hRoot( NULL ),
+ m_fTextureZoom( 1000.0f )
+ {
+ this->m_aiImageList[ 0 ] = 0;
+ this->m_aiImageList[ 1 ] = 1;
+ this->m_aiImageList[ 2 ] = 2;
+ this->m_aiImageList[ 3 ] = 3;
+ this->m_aiImageList[ 4 ] = 4;
+
+ this->m_avCheckerColors[ 0 ].x = this->m_avCheckerColors[ 0 ].y = this->m_avCheckerColors[ 0 ].z = 0.4f;
+ this->m_avCheckerColors[ 1 ].x = this->m_avCheckerColors[ 1 ].y = this->m_avCheckerColors[ 1 ].z = 0.6f;
+ }
+
+ public:
+
+
+ //------------------------------------------------------------------
+ enum
+ {
+ // the full model is displayed
+ VIEWMODE_FULL,
+
+ // a material is displayed on a simple spjere as model
+ VIEWMODE_MATERIAL,
+
+ // a texture with an UV set mapped on it is displayed
+ VIEWMODE_TEXTURE,
+
+ // a single node in the scenegraph is displayed
+ VIEWMODE_NODE,
+ };
+
+
+ //------------------------------------------------------------------
+ // represents a texture in the tree view
+ struct TextureInfo
+ {
+ // texture info
+ IDirect3DTexture9** piTexture;
+
+ // Blend factor of the texture
+ float fBlend;
+
+ // blend operation for the texture
+ aiTextureOp eOp;
+
+ // UV index for the texture
+ unsigned int iUV;
+
+ // Associated tree item
+ HTREEITEM hTreeItem;
+
+ // Original path to the texture
+ std::string szPath;
+
+ // index of the corresponding material
+ unsigned int iMatIndex;
+
+ // type of the texture
+ unsigned int iType;
+ };
+
+ //------------------------------------------------------------------
+ // represents a node in the tree view
+ struct NodeInfo
+ {
+ // node object
+ aiNode* psNode;
+
+ // corresponding tree view item
+ HTREEITEM hTreeItem;
+ };
+
+ //------------------------------------------------------------------
+ // represents a mesh in the tree view
+ struct MeshInfo
+ {
+ // the mesh object
+ aiMesh* psMesh;
+
+ // corresponding tree view item
+ HTREEITEM hTreeItem;
+ };
+
+ //------------------------------------------------------------------
+ // represents a material in the tree view
+ struct MaterialInfo
+ {
+ // material index
+ unsigned int iIndex;
+
+ // material object
+ aiMaterial* psMaterial;
+
+ // ID3DXEffect interface
+ ID3DXEffect* piEffect;
+
+ // corresponding tree view item
+ HTREEITEM hTreeItem;
+ };
+
+ //------------------------------------------------------------------
+ // Singleton accessors
+ static CDisplay s_cInstance;
+ inline static CDisplay& Instance()
+ {
+ return s_cInstance;
+ }
+
+
+ //------------------------------------------------------------------
+ // Called during the render loop. Renders the scene (including the
+ // HUD etc) in the current view mode
+ int OnRender();
+
+ //------------------------------------------------------------------
+ // called when the user selects another item in the "Display" tree
+ // view the method determines the new view mode and performs all
+ // required operations
+ // \param p_hTreeItem Selected tree view item
+ int OnSetup( HTREEITEM p_hTreeItem );
+
+ //------------------------------------------------------------------
+ // Variant 1: Render the full scene with the asset
+ int RenderFullScene();
+
+#if 0
+ //------------------------------------------------------------------
+ // Variant 2: Render only a part of the scene. One node to
+ // be exact
+ int RenderScenePart();
+#endif
+
+ //------------------------------------------------------------------
+ // Variant 3: Render a large sphere and map a given material on it
+ int RenderMaterialView();
+
+ //------------------------------------------------------------------
+ // Variant 4: Render a flat plane, map a texture on it and
+ // display the UV wire on it
+ int RenderTextureView();
+
+ //------------------------------------------------------------------
+ // Fill the UI combobox with a list of all supported view modi
+ //
+ // The display modes are added in order
+ int FillDisplayList( void );
+
+ //------------------------------------------------------------------
+ // Add a material and all sub textures to the display mode list
+ // hRoot - Handle to the root of the tree view
+ // iIndex - Material index
+ int AddMaterialToDisplayList( HTREEITEM hRoot,
+ unsigned int iIndex );
+
+ //------------------------------------------------------------------
+ // Add a texture to the display list
+ // pcMat - material containing the texture
+ // hTexture - Handle to the material tree item
+ // szPath - Path to the texture
+ // iUVIndex - UV index to be used for the texture
+ // fBlendFactor - Blend factor to be used for the texture
+ // eTextureOp - texture operation to be used for the texture
+ int AddTextureToDisplayList( unsigned int iType,
+ unsigned int iIndex,
+ const aiString* szPath,
+ HTREEITEM hFX,
+ unsigned int iUVIndex = 0,
+ const float fBlendFactor = 0.0f,
+ aiTextureOp eTextureOp = aiTextureOp_Multiply,
+ unsigned int iMesh = 0 );
+
+ //------------------------------------------------------------------
+ // Add a node to the display list
+ // Recusrivly adds all subnodes as well
+ // iIndex - Index of the node in the parent's child list
+ // iDepth - Current depth of the node
+ // pcNode - Node object
+ // hRoot - Parent tree view node
+ int AddNodeToDisplayList(
+ unsigned int iIndex,
+ unsigned int iDepth,
+ aiNode* pcNode,
+ HTREEITEM hRoot );
+
+ //------------------------------------------------------------------
+ // Add a mesh to the display list
+ // iIndex - Index of the mesh in the scene's mesh list
+ // hRoot - Parent tree view node
+ int AddMeshToDisplayList(
+ unsigned int iIndex,
+ HTREEITEM hRoot );
+
+ //------------------------------------------------------------------
+ // Load the image list for the tree view item
+ int LoadImageList( void );
+
+ //------------------------------------------------------------------
+ // Expand all nodes in the tree
+ int ExpandTree();
+
+ //------------------------------------------------------------------
+ // Fill the UI combobox with a list of all supported animations
+ // The animations are added in order
+ int FillAnimList( void );
+
+ //------------------------------------------------------------------
+ // Clear the combox box containing the list of animations
+ int ClearAnimList( void );
+
+ //------------------------------------------------------------------
+ // Clear the combox box containing the list of scenegraph items
+ int ClearDisplayList( void );
+
+ //------------------------------------------------------------------
+ // Fill in the default statistics
+ int FillDefaultStatistics( void );
+
+ //------------------------------------------------------------------
+ // Called by LoadAsset()
+ // reset the class instance to the default values
+ int Reset( void );
+
+ //------------------------------------------------------------------
+ // Replace the texture that is current selected with
+ // a new texture
+ int ReplaceCurrentTexture( const char* szPath );
+
+ //------------------------------------------------------------------
+ // Display the context menu (if there) for the specified tree item
+ // hItem Valid tree view item handle
+ int ShowTreeViewContextMenu( HTREEITEM hItem );
+
+ //------------------------------------------------------------------
+ // Event handling for pop-up menus displayed by th tree view
+ int HandleTreeViewPopup( WPARAM wParam, LPARAM lParam );
+
+ //------------------------------------------------------------------
+ // Enable animation-related parts of the UI
+ int EnableAnimTools( BOOL hm );
+
+ //------------------------------------------------------------------
+ // setter for m_iViewMode
+ inline void SetViewMode( unsigned int p_iNew )
+ {
+ this->m_iViewMode = p_iNew;
+ }
+
+ //------------------------------------------------------------------
+ // getter for m_iViewMode
+ inline unsigned int GetViewMode()
+ {
+ return m_iViewMode;
+ }
+
+ //------------------------------------------------------------------
+ // change the texture view's zoom factor
+ inline void SetTextureViewZoom( float f )
+ {
+ // FIX: Removed log(), seems to make more problems than it fixes
+ this->m_fTextureZoom += f * 15;
+ if( this->m_fTextureZoom < 0.05f )this->m_fTextureZoom = 0.05f;
+ }
+
+ //------------------------------------------------------------------
+ // change the texture view's offset on the x axis
+ inline void SetTextureViewOffsetX( float f )
+ {
+ this->m_vTextureOffset.x += f;
+ }
+
+ //------------------------------------------------------------------
+ // change the texture view's offset on the y axis
+ inline void SetTextureViewOffsetY( float f )
+ {
+ this->m_vTextureOffset.y += f;
+ }
+
+ //------------------------------------------------------------------
+ // add a new texture to the list
+ inline void AddTexture( const TextureInfo& info )
+ {
+ this->m_asTextures.push_back( info );
+ }
+
+ //------------------------------------------------------------------
+ // add a new node to the list
+ inline void AddNode( const NodeInfo& info )
+ {
+ this->m_asNodes.push_back( info );
+ }
+
+ //------------------------------------------------------------------
+ // add a new mesh to the list
+ inline void AddMesh( const MeshInfo& info )
+ {
+ this->m_asMeshes.push_back( info );
+ }
+
+ //------------------------------------------------------------------
+ // add a new material to the list
+ inline void AddMaterial( const MaterialInfo& info )
+ {
+ this->m_asMaterials.push_back( info );
+ }
+
+ //------------------------------------------------------------------
+ // set the primary color of the checker pattern background
+ inline void SetFirstCheckerColor( D3DXVECTOR4 c )
+ {
+ this->m_avCheckerColors[ 0 ] = c;
+ }
+
+ //------------------------------------------------------------------
+ // set the secondary color of the checker pattern background
+ inline void SetSecondCheckerColor( D3DXVECTOR4 c )
+ {
+ this->m_avCheckerColors[ 1 ] = c;
+ }
+
+ //------------------------------------------------------------------
+ // get the primary color of the checker pattern background
+ inline const D3DXVECTOR4* GetFirstCheckerColor() const
+ {
+ return &this->m_avCheckerColors[ 0 ];
+ }
+
+ //------------------------------------------------------------------
+ // get the secondary color of the checker pattern background
+ inline const D3DXVECTOR4* GetSecondCheckerColor() const
+ {
+ return &this->m_avCheckerColors[ 1 ];
+ }
+
+ private:
+
+ //------------------------------------------------------------------
+ // Render a screen-filling square using the checker pattern shader
+ int RenderPatternBG();
+
+ //------------------------------------------------------------------
+ // Render a given node in the scenegraph
+ // piNode Node to be rendered
+ // piMatrix Current transformation matrix
+ // bAlpha Render alpha or opaque objects only?
+ int RenderNode( aiNode* piNode, const aiMatrix4x4& piMatrix,
+ bool bAlpha = false );
+
+ //------------------------------------------------------------------
+ // Setup the camera for the stereo view rendering mode
+ int SetupStereoView();
+
+ //------------------------------------------------------------------
+ // Render the second view (for the right eye) in stereo mod
+ // m - World matrix
+ int RenderStereoView( const aiMatrix4x4& m );
+
+ //------------------------------------------------------------------
+ // Handle user input
+ int HandleInput();
+
+ //------------------------------------------------------------------
+ // Handle user input for the texture viewer
+ int HandleInputTextureView();
+
+ //------------------------------------------------------------------
+ // Handle user input if no asset is loaded
+ int HandleInputEmptyScene();
+
+ //------------------------------------------------------------------
+ // Draw the HUD (call only if FPS mode isn't active)
+ int DrawHUD();
+
+ //------------------------------------------------------------------
+ // Used by OnSetup().
+ // Do everything necessary to switch to texture view mode
+ int OnSetupTextureView( TextureInfo* pcNew );
+
+ //------------------------------------------------------------------
+ // Used by OnSetup().
+ // Do everything necessary to switch to material view mode
+ int OnSetupMaterialView( MaterialInfo* pcNew );
+
+ //------------------------------------------------------------------
+ // Used by OnSetup().
+ // Do everything necessary to switch to node view mode
+ int OnSetupNodeView( NodeInfo* pcNew );
+
+ //------------------------------------------------------------------
+ // Used by OnSetup().
+ // Do everything necessary to switch back to normal view mode
+ int OnSetupNormalView();
+
+ //------------------------------------------------------------------
+ // Used by HandleTreeViewPopup().
+ int HandleTreeViewPopup2( WPARAM wParam, LPARAM lParam );
+
+ //------------------------------------------------------------------
+ // Render skeleton
+ int RenderSkeleton( aiNode* piNode, const aiMatrix4x4& piMatrix,
+ const aiMatrix4x4& parent );
+
+
+
+ private:
+
+ // view mode
+ unsigned int m_iViewMode;
+
+ // List of all textures in the display CB
+ std::vector<TextureInfo> m_asTextures;
+
+ // current texture or NULL if no texture is active
+ TextureInfo* m_pcCurrentTexture;
+
+ // List of all node in the display CB
+ std::vector<NodeInfo> m_asNodes;
+
+ // List of all node in the display CB
+ std::vector<MeshInfo> m_asMeshes;
+
+ // current Node or NULL if no Node is active
+ NodeInfo* m_pcCurrentNode;
+
+ // List of all materials in the display CB
+ std::vector<MaterialInfo> m_asMaterials;
+
+ // current material or NULL if no material is active
+ MaterialInfo* m_pcCurrentMaterial;
+
+ // indices into the image list of the "display" tree view control
+ unsigned int m_aiImageList[ 5 ]; /* = {0,1,2,3,4};*/
+
+ // Image list
+ HIMAGELIST m_hImageList;
+
+ // Root node of the tree, "Model"
+ HTREEITEM m_hRoot;
+
+ // Current zoom factor of the texture viewer
+ float m_fTextureZoom;
+
+ // Current offset (in pixels) of the texture viewer
+ aiVector2D m_vTextureOffset;
+
+ // Colors used to draw the checker pattern (for the
+ // texture viewer as background )
+ D3DXVECTOR4 m_avCheckerColors[ 2 ];
+
+ // View projection matrix
+ aiMatrix4x4 mViewProjection;
+ aiVector3D vPos;
+ };
+
+}
+#endif // AV_DISPLAY_H_INCLUDE