mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-04-28 15:55:39 +00:00
update assimp lib
This commit is contained in:
parent
03a348deb7
commit
d3f8fee74e
1725 changed files with 196314 additions and 62009 deletions
|
|
@ -1,9 +1,7 @@
|
|||
# Open Asset Import Library (assimp)
|
||||
# ----------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2006-2022, assimp team
|
||||
|
||||
|
||||
# Copyright (c) 2006-2024, assimp team
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use of this software in source and binary forms,
|
||||
|
|
@ -62,6 +60,14 @@ ADD_EXECUTABLE( assimp_cmd
|
|||
${ASSIMP_CMD_RC}
|
||||
)
|
||||
|
||||
IF (ASSIMP_WARNINGS_AS_ERRORS)
|
||||
IF (MSVC)
|
||||
TARGET_COMPILE_OPTIONS(assimp_cmd PRIVATE /W4 /WX)
|
||||
ELSE()
|
||||
TARGET_COMPILE_OPTIONS(assimp_cmd PRIVATE -Wall -Werror)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_cmd)
|
||||
|
||||
SET_PROPERTY(TARGET assimp_cmd PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
|
||||
|
||||
|
|
@ -910,7 +910,7 @@ int Assimp_CompareDump (const char* const* params, unsigned int num)
|
|||
if (m_file)
|
||||
{
|
||||
fclose(m_file);
|
||||
m_file = NULL;
|
||||
m_file = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
|
||||
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -50,27 +48,35 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
const char *AICMD_MSG_INFO_HELP_E =
|
||||
constexpr char AICMD_MSG_INFO_HELP_E[] =
|
||||
"assimp info <file> [-r] [-v]\n"
|
||||
"\tPrint basic structure of a 3D model\n"
|
||||
"\t-r,--raw: No postprocessing, do a raw import\n"
|
||||
"\t-v,--verbose: Print verbose info such as node transform data\n"
|
||||
"\t-s, --silent: Print only minimal info\n";
|
||||
|
||||
const char *TREE_BRANCH_ASCII = "|-";
|
||||
const char *TREE_BRANCH_UTF8 = "\xe2\x94\x9c\xe2\x95\xb4";
|
||||
const char *TREE_STOP_ASCII = "'-";
|
||||
const char *TREE_STOP_UTF8 = "\xe2\x94\x94\xe2\x95\xb4";
|
||||
const char *TREE_CONTINUE_ASCII = "| ";
|
||||
const char *TREE_CONTINUE_UTF8 = "\xe2\x94\x82 ";
|
||||
|
||||
// note: by default this is using utf-8 text.
|
||||
// this is well supported on pretty much any linux terminal.
|
||||
// if this causes problems on some platform,
|
||||
// put an #ifdef to use the ascii version for that platform.
|
||||
#ifdef _WIN32
|
||||
constexpr char TREE_BRANCH_ASCII[] = "|-";
|
||||
constexpr char TREE_STOP_ASCII[] = "'-";
|
||||
constexpr char TREE_CONTINUE_ASCII[] = "| ";
|
||||
|
||||
const char *TREE_BRANCH = TREE_BRANCH_ASCII;
|
||||
const char *TREE_STOP = TREE_STOP_ASCII;
|
||||
const char *TREE_CONTINUE = TREE_CONTINUE_ASCII;
|
||||
#else // _WIN32
|
||||
constexpr char TREE_BRANCH_UTF8[] = "\xe2\x94\x9c\xe2\x95\xb4";
|
||||
constexpr char TREE_STOP_UTF8[] = "\xe2\x94\x94\xe2\x95\xb4";
|
||||
constexpr char TREE_CONTINUE_UTF8[] = "\xe2\x94\x82 ";
|
||||
|
||||
const char *TREE_BRANCH = TREE_BRANCH_UTF8;
|
||||
const char *TREE_STOP = TREE_STOP_UTF8;
|
||||
const char *TREE_CONTINUE = TREE_CONTINUE_UTF8;
|
||||
#endif // _WIN32
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
unsigned int CountNodes(const aiNode *root) {
|
||||
|
|
@ -173,7 +179,7 @@ void FindSpecialPoints(const aiScene *scene, aiVector3D special_points[3]) {
|
|||
|
||||
// -----------------------------------------------------------------------------------
|
||||
std::string FindPTypes(const aiScene *scene) {
|
||||
bool haveit[4] = { 0 };
|
||||
bool haveit[4] = { false };
|
||||
for (unsigned int i = 0; i < scene->mNumMeshes; ++i) {
|
||||
const unsigned int pt = scene->mMeshes[i]->mPrimitiveTypes;
|
||||
if (pt & aiPrimitiveType_POINT) {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -58,11 +58,12 @@ public:
|
|||
~ConsoleProgressHandler() override = default;
|
||||
|
||||
bool Update(float percentage) override {
|
||||
std::cout << percentage * 100.0f << " %\n";
|
||||
std::cout << "\r" << percentage * 100.0f << " %";
|
||||
return true;
|
||||
}
|
||||
};
|
||||
const char* AICMD_MSG_ABOUT =
|
||||
|
||||
constexpr char AICMD_MSG_ABOUT[] =
|
||||
"------------------------------------------------------ \n"
|
||||
"Open Asset Import Library (\"Assimp\", https://github.com/assimp/assimp) \n"
|
||||
" -- Commandline toolchain --\n"
|
||||
|
|
@ -70,7 +71,7 @@ const char* AICMD_MSG_ABOUT =
|
|||
|
||||
"Version %i.%i %s%s%s%s%s(GIT commit %x)\n\n";
|
||||
|
||||
const char* AICMD_MSG_HELP =
|
||||
constexpr char AICMD_MSG_HELP[] =
|
||||
"assimp <verb> <parameters>\n\n"
|
||||
" verbs:\n"
|
||||
" \tinfo - Quick file stats\n"
|
||||
|
|
@ -96,8 +97,7 @@ const char* AICMD_MSG_HELP =
|
|||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Application entry point
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
int main (int argc, char* argv[]) {
|
||||
if (argc <= 1) {
|
||||
printf("assimp: No command specified. Use \'assimp help\' for a detailed command list\n");
|
||||
return AssimpCmdError::Success;
|
||||
|
|
@ -291,7 +291,7 @@ const aiScene* ImportModel(
|
|||
// Now validate this flag combination
|
||||
if(!globalImporter->ValidateFlags(imp.ppFlags)) {
|
||||
printf("ERROR: Unsupported post-processing flags \n");
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
printf("Validating postprocessing flags ... OK\n");
|
||||
if (imp.showLog) {
|
||||
|
|
@ -303,7 +303,7 @@ const aiScene* ImportModel(
|
|||
const clock_t first = clock();
|
||||
ConsoleProgressHandler *ph = new ConsoleProgressHandler;
|
||||
globalImporter->SetProgressHandler(ph);
|
||||
|
||||
|
||||
const aiScene* scene = globalImporter->ReadFile(path,imp.ppFlags);
|
||||
|
||||
if (imp.showLog) {
|
||||
|
|
@ -311,7 +311,7 @@ const aiScene* ImportModel(
|
|||
}
|
||||
if (!scene) {
|
||||
printf("ERROR: Failed to load file: %s\n", globalImporter->GetErrorString());
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const clock_t second = ::clock();
|
||||
|
|
@ -550,10 +550,7 @@ int ProcessStandardArguments(
|
|||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
int Assimp_TestBatchLoad (
|
||||
const char* const* params,
|
||||
unsigned int num)
|
||||
{
|
||||
int Assimp_TestBatchLoad(const char* const* params, unsigned int num) {
|
||||
for(unsigned int i = 0; i < num; ++i) {
|
||||
globalImporter->ReadFile(params[i],aiProcessPreset_TargetRealtime_MaxQuality);
|
||||
// we're totally silent. scene destructs automatically.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define AICMD_MAIN_INCLUDED
|
||||
|
||||
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
# define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -60,26 +60,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <assimp/scene.h>
|
||||
#include <assimp/Importer.hpp>
|
||||
#include <assimp/DefaultLogger.hpp>
|
||||
#include "../code/Common/Compression.h"
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||
# include <assimp/Exporter.hpp>
|
||||
#endif
|
||||
|
||||
#ifdef ASSIMP_BUILD_NO_OWN_ZLIB
|
||||
#include <zlib.h>
|
||||
#else
|
||||
#include <../contrib/zlib/zlib.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
# define SIZE_MAX (std::numeric_limits<size_t>::max())
|
||||
#endif
|
||||
|
||||
|
||||
using namespace Assimp;
|
||||
|
||||
|
||||
// Global assimp importer instance
|
||||
extern Assimp::Importer* globalImporter;
|
||||
|
||||
|
|
@ -118,8 +110,8 @@ struct ImportData {
|
|||
aiVector3D rot;
|
||||
};
|
||||
|
||||
/// \enum AssimpCmdError
|
||||
/// \brief General error codes used among assimp_cmd's utilities.
|
||||
// ------------------------------------------------------------------------------
|
||||
/// @brief General error codes used among assimp_cmd's utilities.
|
||||
enum AssimpCmdError {
|
||||
Success = 0,
|
||||
InvalidNumberOfArguments,
|
||||
|
|
@ -179,8 +171,8 @@ int Assimp_Dump (
|
|||
const char* const* params,
|
||||
unsigned int num);
|
||||
|
||||
/// \enum AssimpCmdExportError
|
||||
/// \brief Error codes used by the 'Export' utility.
|
||||
// ------------------------------------------------------------------------------
|
||||
/// @brief Error codes used by the 'Export' utility.
|
||||
enum AssimpCmdExportError {
|
||||
FailedToImportModel = AssimpCmdError::LastAssimpCmdError,
|
||||
FailedToExportModel,
|
||||
|
|
@ -199,8 +191,8 @@ int Assimp_Export (
|
|||
const char* const* params,
|
||||
unsigned int num);
|
||||
|
||||
/// \enum AssimpCmdExtractError
|
||||
/// \brief Error codes used by the 'Image Extractor' utility.
|
||||
// ------------------------------------------------------------------------------
|
||||
/// @brief Error codes used by the 'Image Extractor' utility.
|
||||
enum AssimpCmdExtractError {
|
||||
TextureIndexIsOutOfRange = AssimpCmdError::LastAssimpCmdError,
|
||||
NoAvailableTextureEncoderFound,
|
||||
|
|
@ -220,8 +212,8 @@ int Assimp_Extract (
|
|||
const char* const* params,
|
||||
unsigned int num);
|
||||
|
||||
/// \enum AssimpCmdCompareDumpError
|
||||
/// \brief Error codes used by the 'Compare Dump' utility.
|
||||
// ------------------------------------------------------------------------------
|
||||
/// @brief Error codes used by the 'Compare Dump' utility.
|
||||
enum AssimpCmdCompareDumpError {
|
||||
FailedToLoadExpectedInputFile = AssimpCmdError::LastAssimpCmdError,
|
||||
FileComparaisonFailure,
|
||||
|
|
@ -241,8 +233,7 @@ int Assimp_CompareDump (
|
|||
const char* const* params,
|
||||
unsigned int num);
|
||||
|
||||
/// \enum AssimpCmdInfoError
|
||||
/// \brief Error codes used by the 'Info' utility.
|
||||
/// @brief Error codes used by the 'Info' utility.
|
||||
enum AssimpCmdInfoError {
|
||||
InvalidCombinaisonOfArguments = AssimpCmdError::LastAssimpCmdError,
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "revision.h"
|
||||
#include <assimp/revision.h>
|
||||
#if defined(__GNUC__) && defined(_WIN32)
|
||||
#include "winresrc.h"
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -55,12 +55,6 @@ AnimEvaluator::AnimEvaluator(const aiAnimation *pAnim) :
|
|||
mLastPositions.resize(pAnim->mNumChannels, std::make_tuple(0, 0, 0));
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Destructor.
|
||||
AnimEvaluator::~AnimEvaluator() {
|
||||
// empty
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Evaluates the animation tracks for a given time stamp.
|
||||
void AnimEvaluator::Evaluate(double pTime) {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -66,7 +66,7 @@ public:
|
|||
AnimEvaluator(const aiAnimation *pAnim);
|
||||
|
||||
/// @brief The class destructor.
|
||||
~AnimEvaluator();
|
||||
~AnimEvaluator() = default;
|
||||
|
||||
/// @brief Evaluates the animation tracks for a given time stamp.
|
||||
/// The calculated pose can be retrieved as an array of transformation
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -77,6 +77,13 @@ public:
|
|||
pcScene = NULL;
|
||||
}
|
||||
|
||||
// set the normal set to be used
|
||||
void SetNormalSet(unsigned int iSet);
|
||||
|
||||
// flip all normal vectors
|
||||
void FlipNormals();
|
||||
void FlipNormalsInt();
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// default vertex data structure
|
||||
// (even if tangents, bitangents or normals aren't
|
||||
|
|
@ -221,16 +228,8 @@ public:
|
|||
|
||||
// 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
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Open Asset Import Library (assimp)
|
||||
# ----------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2006-2022, assimp team
|
||||
# Copyright (c) 2006-2024, assimp team
|
||||
|
||||
|
||||
# All rights reserved.
|
||||
|
|
@ -95,6 +95,14 @@ IF ( MSVC )
|
|||
REMOVE_DEFINITIONS( -DUNICODE -D_UNICODE )
|
||||
ENDIF ()
|
||||
|
||||
IF (ASSIMP_WARNINGS_AS_ERRORS)
|
||||
IF (MSVC)
|
||||
TARGET_COMPILE_OPTIONS(assimp_viewer PRIVATE /W4 /WX)
|
||||
ELSE()
|
||||
TARGET_COMPILE_OPTIONS(assimp_viewer PRIVATE -Wall -Werror)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
# Link the executable to the assimp + dx libs.
|
||||
TARGET_LINK_LIBRARIES ( assimp_viewer assimp ${DirectX_LIBRARY} ${DirectX_D3DX9_LIBRARY} comctl32 winmm )
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -106,6 +106,11 @@ int CDisplay::EnableAnimTools(BOOL hm) {
|
|||
EnableWindow(GetDlgItem(g_hDlg,IDC_PLAY),hm);
|
||||
EnableWindow(GetDlgItem(g_hDlg,IDC_SLIDERANIM),hm);
|
||||
|
||||
if (hm == FALSE) {
|
||||
g_dCurrent = 0.0;
|
||||
SendDlgItemMessage(g_hDlg, IDC_SLIDERANIM, TBM_SETPOS, TRUE, LPARAM(0));
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -115,9 +120,16 @@ int CDisplay::FillAnimList(void) {
|
|||
if (0 != g_pcAsset->pcScene->mNumAnimations)
|
||||
{
|
||||
// now fill in all animation names
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumAnimations;++i) {
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumAnimations; ++i)
|
||||
{
|
||||
std::string animationLabel(g_pcAsset->pcScene->mAnimations[i]->mName.data);
|
||||
if (animationLabel.empty())
|
||||
{
|
||||
animationLabel = std::string("Animation ") + std::to_string(i) + " (UNNAMED)";
|
||||
}
|
||||
|
||||
SendDlgItemMessage(g_hDlg,IDC_COMBO1,CB_ADDSTRING,0,
|
||||
( LPARAM ) g_pcAsset->pcScene->mAnimations[i]->mName.data);
|
||||
(LPARAM)animationLabel.c_str());
|
||||
}
|
||||
|
||||
// also add a dummy - 'none'
|
||||
|
|
@ -139,6 +151,7 @@ int CDisplay::ClearAnimList(void)
|
|||
{
|
||||
// clear the combo box
|
||||
SendDlgItemMessage(g_hDlg,IDC_COMBO1,CB_RESETCONTENT,0,0);
|
||||
EnableAnimTools(FALSE);
|
||||
return 1;
|
||||
}
|
||||
//-------------------------------------------------------------------------------
|
||||
|
|
@ -161,7 +174,7 @@ int CDisplay::AddNodeToDisplayList(
|
|||
ai_assert(nullptr != pcNode);
|
||||
ai_assert(nullptr != hRoot);
|
||||
|
||||
char chTemp[MAXLEN];
|
||||
char chTemp[AI_MAXLEN];
|
||||
|
||||
if(0 == pcNode->mName.length) {
|
||||
if (iIndex >= 100) {
|
||||
|
|
@ -173,12 +186,12 @@ int CDisplay::AddNodeToDisplayList(
|
|||
}
|
||||
else
|
||||
iIndex += iDepth * 10;
|
||||
ai_snprintf(chTemp, MAXLEN,"Node %u",iIndex);
|
||||
ai_snprintf(chTemp,AI_MAXLEN,"Node %u",iIndex);
|
||||
}
|
||||
else {
|
||||
ai_snprintf(chTemp, MAXLEN,"%s",pcNode->mName.data);
|
||||
ai_snprintf(chTemp, AI_MAXLEN, "%s", pcNode->mName.data);
|
||||
}
|
||||
ai_snprintf(chTemp+strlen(chTemp), MAXLEN- strlen(chTemp), iIndex ? " (%i)" : " (%i meshes)",pcNode->mNumMeshes);
|
||||
ai_snprintf(chTemp + strlen(chTemp), AI_MAXLEN - strlen(chTemp), iIndex ? " (%i)" : " (%i meshes)", pcNode->mNumMeshes);
|
||||
|
||||
TVITEMEXW tvi;
|
||||
TVINSERTSTRUCTW sNew;
|
||||
|
|
@ -223,15 +236,15 @@ int CDisplay::AddMeshToDisplayList(unsigned int iIndex, HTREEITEM hRoot)
|
|||
{
|
||||
aiMesh* pcMesh = g_pcAsset->pcScene->mMeshes[iIndex];
|
||||
|
||||
char chTemp[MAXLEN];
|
||||
char chTemp[AI_MAXLEN];
|
||||
|
||||
if(0 == pcMesh->mName.length) {
|
||||
ai_snprintf(chTemp,MAXLEN,"Mesh %u",iIndex);
|
||||
ai_snprintf(chTemp, AI_MAXLEN, "Mesh %u", iIndex);
|
||||
}
|
||||
else {
|
||||
ai_snprintf(chTemp,MAXLEN,"%s",pcMesh->mName.data);
|
||||
ai_snprintf(chTemp, AI_MAXLEN, "%s", pcMesh->mName.data);
|
||||
}
|
||||
ai_snprintf(chTemp+strlen(chTemp),MAXLEN-strlen(chTemp), iIndex ? " (%i)" : " (%i faces)",pcMesh->mNumFaces);
|
||||
ai_snprintf(chTemp + strlen(chTemp), AI_MAXLEN - strlen(chTemp), iIndex ? " (%i)" : " (%i faces)", pcMesh->mNumFaces);
|
||||
|
||||
TVITEMEXW tvi;
|
||||
TVINSERTSTRUCTW sNew;
|
||||
|
|
@ -267,8 +280,7 @@ int CDisplay::AddMeshToDisplayList(unsigned int iIndex, HTREEITEM hRoot)
|
|||
|
||||
//-------------------------------------------------------------------------------
|
||||
// Replace the currently selected texture by another one
|
||||
int CDisplay::ReplaceCurrentTexture(const char* szPath)
|
||||
{
|
||||
int CDisplay::ReplaceCurrentTexture(const char* szPath) {
|
||||
ai_assert(nullptr != szPath);
|
||||
|
||||
// well ... try to load it
|
||||
|
|
@ -518,20 +530,19 @@ int CDisplay::AddTextureToDisplayList(unsigned int iType,
|
|||
return 1;
|
||||
}
|
||||
//-------------------------------------------------------------------------------
|
||||
int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
|
||||
unsigned int iIndex)
|
||||
{
|
||||
int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot, unsigned int iIndex) {
|
||||
ai_assert(nullptr != hRoot);
|
||||
|
||||
aiMaterial* pcMat = g_pcAsset->pcScene->mMaterials[iIndex];
|
||||
|
||||
if (g_pcAsset->pcScene->mNumMeshes == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// find the first mesh using this material index
|
||||
unsigned int iMesh = 0;
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i)
|
||||
{
|
||||
if (iIndex == g_pcAsset->pcScene->mMeshes[i]->mMaterialIndex)
|
||||
{
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i) {
|
||||
if (iIndex == g_pcAsset->pcScene->mMeshes[i]->mMaterialIndex) {
|
||||
iMesh = i;
|
||||
break;
|
||||
}
|
||||
|
|
@ -540,12 +551,9 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
|
|||
// use the name of the material, if possible
|
||||
char chTemp[512];
|
||||
aiString szOut;
|
||||
if (AI_SUCCESS != aiGetMaterialString(pcMat,AI_MATKEY_NAME,&szOut))
|
||||
{
|
||||
if (AI_SUCCESS != aiGetMaterialString(pcMat,AI_MATKEY_NAME,&szOut)) {
|
||||
ai_snprintf(chTemp,512,"Material %i",iIndex+1);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
ai_snprintf(chTemp,512,"%s (%i)",szOut.data,iIndex+1);
|
||||
}
|
||||
TVITEMEXW tvi;
|
||||
|
|
@ -577,17 +585,15 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
|
|||
aiTextureOp eOp;
|
||||
aiString szPath;
|
||||
bool bNoOpacity = true;
|
||||
for (unsigned int i = 0; i <= AI_TEXTURE_TYPE_MAX;++i)
|
||||
{
|
||||
for (unsigned int i = 0; i <= AI_TEXTURE_TYPE_MAX;++i) {
|
||||
unsigned int iNum = 0;
|
||||
while (true)
|
||||
{
|
||||
if (AI_SUCCESS != aiGetMaterialTexture(pcMat,(aiTextureType)i,iNum,
|
||||
&szPath,nullptr, &iUV,&fBlend,&eOp))
|
||||
{
|
||||
while (true) {
|
||||
if (AI_SUCCESS != aiGetMaterialTexture(pcMat,(aiTextureType)i,iNum, &szPath,nullptr, &iUV,&fBlend,&eOp)) {
|
||||
break;
|
||||
}
|
||||
if (aiTextureType_OPACITY == i)bNoOpacity = false;
|
||||
if (aiTextureType_OPACITY == i) {
|
||||
bNoOpacity = false;
|
||||
}
|
||||
AddTextureToDisplayList(i,iNum,&szPath,hTexture,iUV,fBlend,eOp,iMesh);
|
||||
++iNum;
|
||||
}
|
||||
|
|
@ -595,8 +601,7 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
|
|||
|
||||
AssetHelper::MeshHelper* pcMesh = g_pcAsset->apcMeshes[iMesh];
|
||||
|
||||
if (pcMesh->piDiffuseTexture && pcMesh->piDiffuseTexture == pcMesh->piOpacityTexture && bNoOpacity)
|
||||
{
|
||||
if (pcMesh->piDiffuseTexture && pcMesh->piDiffuseTexture == pcMesh->piOpacityTexture && bNoOpacity) {
|
||||
// check whether the diffuse texture is not a default texture
|
||||
|
||||
// {9785DA94-1D96-426b-B3CB-BADC36347F5E}
|
||||
|
|
@ -606,9 +611,7 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
|
|||
|
||||
uint32_t iData = 0;
|
||||
DWORD dwSize = 4;
|
||||
if(FAILED( pcMesh->piDiffuseTexture->GetPrivateData(guidPrivateData,&iData,&dwSize) ||
|
||||
0xffffffff == iData))
|
||||
{
|
||||
if(FAILED( pcMesh->piDiffuseTexture->GetPrivateData(guidPrivateData,&iData,&dwSize) || 0xffffffff == iData)) {
|
||||
// seems the diffuse texture contains alpha, therefore it has been
|
||||
// added to the opacity channel, too. Add a special value ...
|
||||
AddTextureToDisplayList(aiTextureType_OPACITY | 0x40000000,
|
||||
|
|
@ -625,33 +628,26 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
|
|||
this->AddMaterial(info);
|
||||
return 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// Expand all elements in the tree-view
|
||||
int CDisplay::ExpandTree()
|
||||
{
|
||||
int CDisplay::ExpandTree() {
|
||||
// expand all materials
|
||||
for (std::vector< MaterialInfo >::iterator
|
||||
i = m_asMaterials.begin();
|
||||
i != m_asMaterials.end();++i)
|
||||
{
|
||||
for (std::vector< MaterialInfo >::iterator i = m_asMaterials.begin(); i != m_asMaterials.end();++i) {
|
||||
TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),(*i).hTreeItem,TVE_EXPAND);
|
||||
}
|
||||
// expand all nodes
|
||||
for (std::vector< NodeInfo >::iterator
|
||||
i = m_asNodes.begin();
|
||||
i != m_asNodes.end();++i)
|
||||
{
|
||||
for (std::vector< NodeInfo >::iterator i = m_asNodes.begin(); i != m_asNodes.end();++i) {
|
||||
TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),(*i).hTreeItem,TVE_EXPAND);
|
||||
}
|
||||
TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),m_hRoot,TVE_EXPAND);
|
||||
return 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// Get image list for tree view
|
||||
int CDisplay::LoadImageList(void)
|
||||
{
|
||||
if (!m_hImageList)
|
||||
{
|
||||
int CDisplay::LoadImageList() {
|
||||
if (!m_hImageList) {
|
||||
// First, create the image list we will need.
|
||||
// FIX: Need RGB888 color space to display all colors correctly
|
||||
HIMAGELIST hIml = ImageList_Create( 16,16,ILC_COLOR24, 5, 0 );
|
||||
|
|
@ -682,12 +678,13 @@ int CDisplay::LoadImageList(void)
|
|||
|
||||
m_hImageList = hIml;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// Fill tree view
|
||||
int CDisplay::FillDisplayList(void)
|
||||
{
|
||||
int CDisplay::FillDisplayList(void) {
|
||||
LoadImageList();
|
||||
|
||||
// Initialize the tree view window.
|
||||
|
|
@ -713,11 +710,11 @@ int CDisplay::FillDisplayList(void)
|
|||
(LPARAM)(LPTVINSERTSTRUCT)&sNew);
|
||||
|
||||
// add each loaded material to the tree
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMaterials;++i)
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMaterials; ++i)
|
||||
AddMaterialToDisplayList(m_hRoot,i);
|
||||
|
||||
// add each mesh to the tree
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i)
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes; ++i)
|
||||
AddMeshToDisplayList(i,m_hRoot);
|
||||
|
||||
// now add all loaded nodes recursively
|
||||
|
|
@ -729,8 +726,10 @@ int CDisplay::FillDisplayList(void)
|
|||
// everything reacts a little bit slowly if D3D is rendering,
|
||||
// so give GDI a small hint to leave the couch and work ;-)
|
||||
UpdateWindow(g_hDlg);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// Main render loop
|
||||
int CDisplay::OnRender()
|
||||
|
|
@ -738,23 +737,25 @@ int CDisplay::OnRender()
|
|||
// update possible animation
|
||||
if( g_pcAsset)
|
||||
{
|
||||
static double lastPlaying = 0.;
|
||||
static double lastRenderTime = 0.;
|
||||
|
||||
ai_assert( g_pcAsset->mAnimator);
|
||||
double currentTime = clock() / double(CLOCKS_PER_SEC);
|
||||
if (g_bPlay) {
|
||||
g_dCurrent += clock()/ double( CLOCKS_PER_SEC) -lastPlaying;
|
||||
g_dCurrent += currentTime - lastRenderTime;
|
||||
|
||||
double time = g_dCurrent;
|
||||
aiAnimation* mAnim = g_pcAsset->mAnimator->CurrentAnim();
|
||||
if( mAnim && mAnim->mDuration > 0.0) {
|
||||
double tps = mAnim->mTicksPerSecond ? mAnim->mTicksPerSecond : 25.f;
|
||||
time = fmod( time, mAnim->mDuration/tps);
|
||||
SendDlgItemMessage(g_hDlg,IDC_SLIDERANIM,TBM_SETPOS,TRUE,LPARAM(10000 * (time/(mAnim->mDuration/tps))));
|
||||
if (mAnim && mAnim->mDuration > 0.0) {
|
||||
double tps = mAnim->mTicksPerSecond ? mAnim->mTicksPerSecond : ANIM_DEFAULT_TICKS_PER_SECOND;
|
||||
time = fmod(time, mAnim->mDuration/tps);
|
||||
SendDlgItemMessage(g_hDlg, IDC_SLIDERANIM, TBM_SETPOS, TRUE, LPARAM(ANIM_SLIDER_MAX * (time / (mAnim->mDuration / tps))));
|
||||
}
|
||||
|
||||
g_pcAsset->mAnimator->Calculate( time );
|
||||
lastPlaying = g_dCurrent;
|
||||
}
|
||||
|
||||
lastRenderTime = currentTime;
|
||||
}
|
||||
// begin the frame
|
||||
g_piDevice->BeginScene();
|
||||
|
|
@ -806,8 +807,10 @@ int CDisplay::FillDefaultStatistics(void)
|
|||
SetDlgItemText(g_hDlg,IDC_EVERT,"0");
|
||||
SetDlgItemText(g_hDlg,IDC_EFACE,"0");
|
||||
SetDlgItemText(g_hDlg,IDC_EMAT,"0");
|
||||
SetDlgItemText(g_hDlg,IDC_ENODE,"0");
|
||||
SetDlgItemText(g_hDlg,IDC_EMESH,"0");
|
||||
SetDlgItemText(g_hDlg,IDC_ENODEWND,"0");
|
||||
SetDlgItemText(g_hDlg,IDC_ESHADER,"0");
|
||||
SetDlgItemText(g_hDlg,IDC_ELOAD,"");
|
||||
SetDlgItemText(g_hDlg,IDC_ETEX,"0");
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -890,7 +893,7 @@ int CDisplay::OnSetupNormalView()
|
|||
SetWindowText(GetDlgItem(g_hDlg,IDC_NUMSHADERS),"Shaders:");
|
||||
SetWindowText(GetDlgItem(g_hDlg,IDC_NUMMATS),"Materials:");
|
||||
SetWindowText(GetDlgItem(g_hDlg,IDC_NUMMESHES),"Meshes:");
|
||||
SetWindowText(GetDlgItem(g_hDlg,IDC_LOADTIME),"Time:");
|
||||
SetWindowText(GetDlgItem(g_hDlg,IDC_LOADTIME),"Loading Time:");
|
||||
|
||||
FillDefaultStatistics();
|
||||
SetViewMode(VIEWMODE_FULL);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -175,33 +175,29 @@ VOID WINAPI FillFunc(D3DXVECTOR4* pOut,
|
|||
pOut->x = pOut->y = 1.0f;
|
||||
pOut->z = 0.0f;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
int CMaterialManager::UpdateSpecularMaterials()
|
||||
{
|
||||
if (g_pcAsset && g_pcAsset->pcScene)
|
||||
{
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i)
|
||||
{
|
||||
if (aiShadingMode_Phong == g_pcAsset->apcMeshes[i]->eShadingMode)
|
||||
{
|
||||
int CMaterialManager::UpdateSpecularMaterials() {
|
||||
if (g_pcAsset && g_pcAsset->pcScene) {
|
||||
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i) {
|
||||
if (aiShadingMode_Phong == g_pcAsset->apcMeshes[i]->eShadingMode) {
|
||||
this->DeleteMaterial(g_pcAsset->apcMeshes[i]);
|
||||
this->CreateMaterial(g_pcAsset->apcMeshes[i],g_pcAsset->pcScene->mMeshes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
int CMaterialManager::SetDefaultTexture(IDirect3DTexture9** p_ppiOut)
|
||||
{
|
||||
int CMaterialManager::SetDefaultTexture(IDirect3DTexture9** p_ppiOut) {
|
||||
if (sDefaultTexture) {
|
||||
sDefaultTexture->AddRef();
|
||||
*p_ppiOut = sDefaultTexture;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(FAILED(g_piDevice->CreateTexture(
|
||||
256,
|
||||
256,
|
||||
|
|
@ -285,7 +281,7 @@ bool CMaterialManager::TryLongerPath(char* szTemp,aiString* p_szString)
|
|||
// copy the result string back to the aiString
|
||||
const size_t iLen = strlen(szTempB);
|
||||
size_t iLen2 = iLen+1;
|
||||
iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2;
|
||||
iLen2 = iLen2 > AI_MAXLEN ? AI_MAXLEN : iLen2;
|
||||
memcpy(p_szString->data,szTempB,iLen2);
|
||||
p_szString->length = static_cast<ai_uint32>(iLen);
|
||||
return true;
|
||||
|
|
@ -299,7 +295,7 @@ bool CMaterialManager::TryLongerPath(char* szTemp,aiString* p_szString)
|
|||
// copy the result string back to the aiString
|
||||
const size_t iLen = strlen(szTempB);
|
||||
size_t iLen2 = iLen+1;
|
||||
iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2;
|
||||
iLen2 = iLen2 > AI_MAXLEN ? AI_MAXLEN : iLen2;
|
||||
memcpy(p_szString->data,szTempB,iLen2);
|
||||
p_szString->length = static_cast<ai_uint32>(iLen);
|
||||
return true;
|
||||
|
|
@ -406,7 +402,7 @@ int CMaterialManager::FindValidPath(aiString* p_szString)
|
|||
// copy the result string back to the aiStr
|
||||
const size_t len = strlen(szTemp);
|
||||
size_t len2 = len+1;
|
||||
len2 = len2 > MAXLEN ? MAXLEN : len2;
|
||||
len2 = len2 > AI_MAXLEN ? AI_MAXLEN : len2;
|
||||
memcpy(p_szString->data, szTemp, len2);
|
||||
p_szString->length = static_cast<ai_uint32>(len);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -73,7 +73,7 @@ public:
|
|||
/// A shader is considered to be identical if it has the same input
|
||||
/// signature and takes the same number of texture channels.
|
||||
int CreateMaterial(AssetHelper::MeshHelper *pcMesh, const aiMesh *pcSource);
|
||||
|
||||
|
||||
/// @brief Setup the material for a given mesh.
|
||||
/// @param pcMesh Mesh to be rendered
|
||||
/// @param pcProj Projection matrix
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -842,7 +842,7 @@ void OpenAsset() {
|
|||
aiString sz;
|
||||
aiGetExtensionList(&sz);
|
||||
|
||||
char szList[MAXLEN + 100];
|
||||
char szList[AI_MAXLEN + 100];
|
||||
strcpy(szList,"ASSIMP assets");
|
||||
char* szCur = szList + 14;
|
||||
strcpy(szCur,sz.data);
|
||||
|
|
@ -874,9 +874,10 @@ void OpenAsset() {
|
|||
RegSetValueExA(g_hRegistry,"CurrentApp",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH);
|
||||
|
||||
if (0 != strcmp(g_szFileName,szFileName)) {
|
||||
strcpy(g_szFileName, szFileName);
|
||||
DeleteAssetData();
|
||||
DeleteAsset();
|
||||
|
||||
strcpy(g_szFileName, szFileName);
|
||||
LoadAsset();
|
||||
|
||||
// update the history
|
||||
|
|
@ -1197,7 +1198,7 @@ void InitUI() {
|
|||
LoadCheckerPatternColors();
|
||||
|
||||
SendDlgItemMessage(g_hDlg,IDC_SLIDERANIM,TBM_SETRANGEMIN,TRUE,0);
|
||||
SendDlgItemMessage(g_hDlg,IDC_SLIDERANIM,TBM_SETRANGEMAX,TRUE,10000);
|
||||
SendDlgItemMessage(g_hDlg,IDC_SLIDERANIM,TBM_SETRANGEMAX,TRUE,ANIM_SLIDER_MAX);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
|
|
@ -1274,11 +1275,14 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam
|
|||
// XXX quick and dirty fix for #3029892
|
||||
if (GetDlgItem(g_hDlg, IDC_SLIDERANIM) == (HWND)lParam && g_pcAsset && g_pcAsset->pcScene->mAnimations)
|
||||
{
|
||||
double num = (double)SendDlgItemMessage(g_hDlg,IDC_SLIDERANIM,TBM_GETPOS,0,0);
|
||||
const aiAnimation* anim = g_pcAsset->pcScene->mAnimations[ g_pcAsset->mAnimator->CurrentAnimIndex() ];
|
||||
|
||||
g_dCurrent = (anim->mDuration/anim->mTicksPerSecond) * num/10000;
|
||||
g_pcAsset->mAnimator->Calculate(g_dCurrent);
|
||||
if (anim && anim->mDuration > 0.0)
|
||||
{
|
||||
double tps = anim->mTicksPerSecond ? anim->mTicksPerSecond : ANIM_DEFAULT_TICKS_PER_SECOND;
|
||||
double sliderValue = (double)SendDlgItemMessage(g_hDlg, IDC_SLIDERANIM, TBM_GETPOS, 0, 0);
|
||||
g_dCurrent = (anim->mDuration / tps) * sliderValue / ANIM_SLIDER_MAX;
|
||||
g_pcAsset->mAnimator->Calculate(g_dCurrent);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -1666,10 +1670,11 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam
|
|||
}
|
||||
fclose(pFile);
|
||||
} else {
|
||||
strcpy(g_szFileName,szFile);
|
||||
|
||||
DeleteAsset();
|
||||
|
||||
strcpy(g_szFileName, szFile);
|
||||
LoadAsset();
|
||||
|
||||
UpdateHistory();
|
||||
SaveHistory();
|
||||
}
|
||||
|
|
@ -1690,6 +1695,9 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam
|
|||
g_pcAsset->mAnimator->SetAnimIndex(sel);
|
||||
SendDlgItemMessage(hwndDlg,IDC_SLIDERANIM,TBM_SETPOS,TRUE,0);
|
||||
}
|
||||
|
||||
const size_t count = static_cast<size_t>(ComboBox_GetCount(GetDlgItem(hwndDlg, IDC_COMBO1)));
|
||||
CDisplay::Instance().EnableAnimTools(g_pcAsset && count > 0 && sel < count - 1 ? TRUE : FALSE);
|
||||
}
|
||||
} else if (ID_VIEWER_RESETVIEW == LOWORD(wParam)) {
|
||||
g_sCamera.vPos = aiVector3D(0.0f,0.0f,-10.0f);
|
||||
|
|
@ -1827,7 +1835,12 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam
|
|||
}
|
||||
else if (ID_VIEWER_RELOAD == LOWORD(wParam))
|
||||
{
|
||||
// Save the filename to reload and clear
|
||||
char toReloadFileName[MAX_PATH];
|
||||
strcpy(toReloadFileName, g_szFileName);
|
||||
DeleteAsset();
|
||||
|
||||
strcpy(g_szFileName, toReloadFileName);
|
||||
LoadAsset();
|
||||
}
|
||||
else if (ID_IMPORTSETTINGS_RESETTODEFAULT == LOWORD(wParam))
|
||||
|
|
@ -2036,9 +2049,10 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam
|
|||
{
|
||||
if (AI_VIEW_RECENT_FILE_ID(i) == LOWORD(wParam))
|
||||
{
|
||||
strcpy(g_szFileName,g_aPreviousFiles[i].c_str());
|
||||
DeleteAssetData();
|
||||
DeleteAsset();
|
||||
|
||||
strcpy(g_szFileName, g_aPreviousFiles[i].c_str());
|
||||
LoadAsset();
|
||||
|
||||
// update and safe the history
|
||||
|
|
@ -2209,6 +2223,8 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
|||
|
||||
CLogDisplay::Instance().AddEntry("[OK] Here we go!");
|
||||
|
||||
CDisplay::Instance().EnableAnimTools(FALSE);
|
||||
|
||||
// create the log window
|
||||
CLogWindow::Instance().Init();
|
||||
// set the focus to the main window
|
||||
|
|
@ -2397,7 +2413,6 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// render the scene
|
||||
CDisplay::Instance().OnRender();
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -81,7 +81,7 @@ float g_fWheelPos = -10.0f;
|
|||
bool g_bLoadingCanceled = false;
|
||||
IDirect3DTexture9 *g_pcTexture = nullptr;
|
||||
bool g_bPlay = false;
|
||||
double g_dCurrent = 0.;
|
||||
double g_dCurrent = 0.; // Animation time
|
||||
|
||||
// default pp steps
|
||||
unsigned int ppsteps = aiProcess_CalcTangentSpace | // calculate tangents and bitangents if possible
|
||||
|
|
@ -145,9 +145,7 @@ float g_fLoadTime = 0.0f;
|
|||
// The loader thread loads the asset while the progress dialog displays the
|
||||
// smart progress bar
|
||||
//-------------------------------------------------------------------------------
|
||||
DWORD WINAPI LoadThreadProc(LPVOID lpParameter) {
|
||||
UNREFERENCED_PARAMETER(lpParameter);
|
||||
|
||||
DWORD WINAPI LoadThreadProc(LPVOID) {
|
||||
// get current time
|
||||
double fCur = (double)timeGetTime();
|
||||
|
||||
|
|
@ -193,8 +191,8 @@ DWORD WINAPI LoadThreadProc(LPVOID lpParameter) {
|
|||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// load the current asset
|
||||
// THe path to the asset is specified in the global path variable
|
||||
// Load the current asset
|
||||
// The path to the asset is specified in the global variable g_szFileName
|
||||
//-------------------------------------------------------------------------------
|
||||
int LoadAsset() {
|
||||
// set the world and world rotation matrices to the identity
|
||||
|
|
@ -269,14 +267,6 @@ int LoadAsset() {
|
|||
if (1 != CreateAssetData())
|
||||
return 0;
|
||||
|
||||
if (!g_pcAsset->pcScene->HasAnimations()) {
|
||||
EnableWindow(GetDlgItem(g_hDlg, IDC_PLAY), FALSE);
|
||||
EnableWindow(GetDlgItem(g_hDlg, IDC_SLIDERANIM), FALSE);
|
||||
} else {
|
||||
EnableWindow(GetDlgItem(g_hDlg, IDC_PLAY), TRUE);
|
||||
EnableWindow(GetDlgItem(g_hDlg, IDC_SLIDERANIM), TRUE);
|
||||
}
|
||||
|
||||
CLogDisplay::Instance().AddEntry("[OK] The asset has been loaded successfully");
|
||||
CDisplay::Instance().FillDisplayList();
|
||||
CDisplay::Instance().FillAnimList();
|
||||
|
|
@ -293,7 +283,7 @@ int LoadAsset() {
|
|||
|
||||
//-------------------------------------------------------------------------------
|
||||
// Delete the loaded asset
|
||||
// The function does nothing is no asset is loaded
|
||||
// The function does nothing if no asset is loaded
|
||||
//-------------------------------------------------------------------------------
|
||||
int DeleteAsset(void) {
|
||||
if (!g_pcAsset) {
|
||||
|
|
@ -314,6 +304,8 @@ int DeleteAsset(void) {
|
|||
delete g_pcAsset;
|
||||
g_pcAsset = nullptr;
|
||||
|
||||
g_szFileName[0] = '\0';
|
||||
|
||||
// reset the caption of the viewer window
|
||||
SetWindowText(g_hDlg, AI_VIEW_CAPTION_BASE);
|
||||
|
||||
|
|
@ -367,7 +359,7 @@ int CalculateBounds(aiNode *piNode, aiVector3D *p_avOut, const aiMatrix4x4 &piMa
|
|||
// The function calculates the boundaries of the mesh and modifies the
|
||||
// global world transformation matrix according to the aset AABB
|
||||
//-------------------------------------------------------------------------------
|
||||
int ScaleAsset(void) {
|
||||
int ScaleAsset() {
|
||||
aiVector3D aiVecs[2] = { aiVector3D(1e10f, 1e10f, 1e10f),
|
||||
aiVector3D(-1e10f, -1e10f, -1e10f) };
|
||||
|
||||
|
|
@ -521,8 +513,7 @@ int CreateAssetData() {
|
|||
}
|
||||
} else {
|
||||
// create 16 bit index buffer
|
||||
if (FAILED(g_piDevice->CreateIndexBuffer(2 *
|
||||
numIndices,
|
||||
if (FAILED(g_piDevice->CreateIndexBuffer(2 * numIndices,
|
||||
D3DUSAGE_WRITEONLY | dwUsage,
|
||||
D3DFMT_INDEX16,
|
||||
D3DPOOL_DEFAULT,
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2022, assimp team
|
||||
Copyright (c) 2006-2024, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
|
@ -78,6 +78,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
// default movement speed
|
||||
#define MOVE_SPEED 3.f
|
||||
|
||||
// Anim constants
|
||||
#define ANIM_DEFAULT_TICKS_PER_SECOND 25.f
|
||||
#define ANIM_SLIDER_MAX 10000
|
||||
|
||||
#include "AssetHelper.h"
|
||||
#include "Background.h"
|
||||
#include "Camera.h"
|
||||
|
|
@ -98,6 +102,12 @@ namespace AssimpView {
|
|||
//-------------------------------------------------------------------------------
|
||||
// Function prototypes
|
||||
//-------------------------------------------------------------------------------
|
||||
class AssimpVew {
|
||||
public:
|
||||
AssimpVew();
|
||||
~AssimpVew();
|
||||
};
|
||||
|
||||
int InitD3D(void);
|
||||
int ShutdownD3D(void);
|
||||
int CreateDevice(bool p_bMultiSample, bool p_bSuperSample, bool bHW = true);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
#include "revision.h"
|
||||
#include <assimp/revision.h>
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -80,32 +80,32 @@ BEGIN
|
|||
CONTROL "Two lights [L]",IDC_3LIGHTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,93,393,80,10
|
||||
CONTROL "Backface culling [C]",IDC_BFCULL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,93,405,80,10
|
||||
CONTROL "No transparency [T]",IDC_NOAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,93,417,80,10
|
||||
GROUPBOX "Statistics",IDC_STATIC,186,345,164,63
|
||||
GROUPBOX "Statistics",IDC_STATIC,186,345,200,63
|
||||
LTEXT "Vertices:",IDC_NUMVERTS,192,357,35,8
|
||||
LTEXT "Nodes:",IDC_NUMNODES,192,369,35,8
|
||||
LTEXT "Shaders:",IDC_NUMSHADERS,192,381,35,8
|
||||
LTEXT "Time:",IDC_LOADTIME,192,393,35,8
|
||||
EDITTEXT IDC_EVERT,227,357,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_ENODEWND,227,369,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_ESHADER,227,381,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_ELOAD,227,393,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
LTEXT "Faces:",IDC_NUMFACES,272,357,35,8
|
||||
LTEXT "Materials:",IDC_NUMMATS,272,369,35,8
|
||||
LTEXT "Meshes:",IDC_NUMMESHES,272,381,35,8
|
||||
LTEXT "FPS:",IDC_FPS,272,393,35,8
|
||||
EDITTEXT IDC_EFACE,307,357,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_EMAT,307,369,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_EMESH,307,381,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_EFPS,307,393,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
LTEXT "Loading Time:",IDC_LOADTIME,192,393,46,8
|
||||
EDITTEXT IDC_EVERT,241,357,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_ENODEWND,241,369,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_ESHADER,241,381,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_ELOAD,241,393,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
LTEXT "Faces:",IDC_NUMFACES,306,357,35,8
|
||||
LTEXT "Materials:",IDC_NUMMATS,306,369,35,8
|
||||
LTEXT "Meshes:",IDC_NUMMESHES,306,381,35,8
|
||||
LTEXT "FPS:",IDC_FPS,306,393,35,8
|
||||
EDITTEXT IDC_EFACE,341,357,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_EMAT,341,369,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_EMESH,341,381,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_EFPS,341,393,35,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
EDITTEXT IDC_VIEWMATRIX,192,412,72,44,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE | NOT WS_BORDER
|
||||
GROUPBOX "Colors",IDC_STATIC,357,345,109,87
|
||||
LTEXT "Primary:",IDC_STATIC,363,360,48,8
|
||||
LTEXT "Secondary:",IDC_STATIC,363,378,54,8
|
||||
LTEXT "Ambient:",IDC_STATIC,363,396,54,8
|
||||
CONTROL "Button1",IDC_LCOLOR1,"Button",BS_OWNERDRAW | WS_TABSTOP,423,357,35,14
|
||||
CONTROL "Button1",IDC_LCOLOR2,"Button",BS_OWNERDRAW | WS_TABSTOP,423,375,35,14
|
||||
CONTROL "Button1",IDC_LCOLOR3,"Button",BS_OWNERDRAW | WS_TABSTOP,423,393,35,14
|
||||
PUSHBUTTON "Reset",IDC_LRESET,423,411,35,14
|
||||
GROUPBOX "Colors",IDC_STATIC,397,345,109,87
|
||||
LTEXT "Primary:",IDC_STATIC,403,360,48,8
|
||||
LTEXT "Secondary:",IDC_STATIC,403,377,54,8
|
||||
LTEXT "Ambient:",IDC_STATIC,403,396,54,8
|
||||
CONTROL "Button1",IDC_LCOLOR1,"Button",BS_OWNERDRAW | WS_TABSTOP,463,357,35,14
|
||||
CONTROL "Button1",IDC_LCOLOR2,"Button",BS_OWNERDRAW | WS_TABSTOP,463,374,35,14
|
||||
CONTROL "Button1",IDC_LCOLOR3,"Button",BS_OWNERDRAW | WS_TABSTOP,463,393,35,14
|
||||
PUSHBUTTON "Reset",IDC_LRESET,463,411,35,14
|
||||
END
|
||||
|
||||
IDD_LOADDIALOG DIALOGEX 0, 0, 143, 60
|
||||
|
|
|
|||
|
|
@ -1,57 +0,0 @@
|
|||
@echo off
|
||||
set "initialdir=%cd%"
|
||||
goto:main
|
||||
|
||||
:exitsucc
|
||||
cd /d "%initialdir%"
|
||||
set initialdir=
|
||||
|
||||
set MSBUILD_15="C:\Program Files (x86)\Microsoft Visual Studio\2018\Professional\MSBuild\15.0\Bin\msbuild.exe"
|
||||
set MSBUILD_14="C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild.exe"
|
||||
|
||||
if not "%VS150%"=="" set MSBUILD_15="%VS150%\MSBuild\15.0\Bin\msbuild.exe"
|
||||
|
||||
if /i %VS_VERSION%==2017 (
|
||||
set MS_BUILD_EXE=%MSBUILD_15%
|
||||
set PLATFORM_VER=v141
|
||||
) else (
|
||||
set MS_BUILD_EXE=%MSBUILD_14%
|
||||
set PLATFORM_VER=v140
|
||||
)
|
||||
|
||||
set MSBUILD=%MS_BUILD_EXE%
|
||||
|
||||
exit /b 0
|
||||
|
||||
:main
|
||||
if not defined PLATFORM set "PLATFORM=x64"
|
||||
|
||||
::my work here is done?
|
||||
|
||||
set PATH_VSWHERE=C:\Program Files (x86)\Microsoft Visual Studio\Installer\
|
||||
REM set PATH_STUDIO="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\"
|
||||
|
||||
for /f "usebackq tokens=*" %%i in (`"%PATH_VSWHERE%vswhere" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do (
|
||||
set InstallDir=%%i
|
||||
)
|
||||
|
||||
IF EXIST "%InstallDir%\VC\Auxiliary\Build\vcvarsall.bat" set VS150=%InstallDir%\
|
||||
|
||||
set "CMAKE_GENERATOR=Visual Studio 15 2017 Win64"
|
||||
if not "%VS150%"=="" call "%VS150%\VC\Auxiliary\Build\vcvarsall.bat" %PLATFORM% && echo found VS 2o17 && set PLATFORM_VER=v141 && set VS_VERSION=2017 && goto:exitsucc
|
||||
|
||||
set "CMAKE_GENERATOR=Visual Studio 14 2015 Win64"
|
||||
if defined VS140COMNTOOLS call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" %PLATFORM% && echo found VS 2o15 && set PLATFORM_VER=v140 && set VS_VERSION=2015 && goto:exitsucc
|
||||
|
||||
if defined VS130COMNTOOLS echo call ghostbusters... found lost VS version
|
||||
|
||||
set "CMAKE_GENERATOR=Visual Studio 12 2013 Win64"
|
||||
if defined VS120COMNTOOLS call "%VS120COMNTOOLS%..\..\VC\vcvarsall.bat" %PLATFORM% && echo found VS 2o13 && set PLATFORM_VER=v120 && set VS_VERSION=2013 && goto:exitsucc
|
||||
|
||||
set "CMAKE_GENERATOR=Visual Studio 11 2012 Win64"
|
||||
if defined VS110COMNTOOLS call "%VS110COMNTOOLS%..\..\VC\vcvarsall.bat" %PLATFORM% && echo found VS 2o12 && set PLATFORM_VER=v110 && set VS_VERSION=2012 && goto:exitsucc
|
||||
|
||||
set "CMAKE_GENERATOR=Visual Studio 10 2010 Win64"
|
||||
if defined VS100COMNTOOLS call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" %PLATFORM% && echo found VS 2o1o && set PLATFORM_VER=v100 && set VS_VERSION=2010 && goto:exitsucc
|
||||
|
||||
goto:exitsucc
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
rem @echo off
|
||||
setlocal
|
||||
call build_env_win32.bat
|
||||
|
||||
set BUILD_CONFIG=release
|
||||
set PLATFORM_CONFIG=x64
|
||||
set MAX_CPU_CONFIG=4
|
||||
|
||||
set CONFIG_PARAMETER=/p:Configuration="%BUILD_CONFIG%"
|
||||
set PLATFORM_PARAMETER=/p:Platform="%PLATFORM_CONFIG%"
|
||||
set CPU_PARAMETER=/maxcpucount:%MAX_CPU_CONFIG%
|
||||
set PLATFORM_TOOLSET=/p:PlatformToolset=%PLATFORM_VER%
|
||||
|
||||
pushd ..\..\
|
||||
cmake CMakeLists.txt -G "Visual Studio 15 2017 Win64"
|
||||
%MSBUILD% assimp.sln %CONFIG_PARAMETER% %PLATFORM_PARAMETER% %CPU_PARAMETER% %PLATFORM_TOOLSET%
|
||||
popd
|
||||
endlocal
|
||||
BIN
Engine/lib/assimp/tools/shared/assimp_tools_icon.bmp
Normal file
BIN
Engine/lib/assimp/tools/shared/assimp_tools_icon.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.1 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 4.2 KiB |
Loading…
Add table
Add a link
Reference in a new issue