diff options
author | sanine <sanine.not@pm.me> | 2023-02-12 23:53:22 -0600 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2023-02-12 23:53:22 -0600 |
commit | f1fe73d1909a2448a004a88362a1a532d0d4f7c3 (patch) | |
tree | ab37ae3837e2f858de2932bcee9f26e69fab3db1 /libs/assimp/samples/SimpleTexturedOpenGL | |
parent | f567ea1e2798fd3156a416e61f083ea3e6b95719 (diff) |
switch to tinyobj and nanovg from assimp and cairo
Diffstat (limited to 'libs/assimp/samples/SimpleTexturedOpenGL')
4 files changed, 0 insertions, 1191 deletions
diff --git a/libs/assimp/samples/SimpleTexturedOpenGL/CMakeLists.txt b/libs/assimp/samples/SimpleTexturedOpenGL/CMakeLists.txt deleted file mode 100644 index 1837af0..0000000 --- a/libs/assimp/samples/SimpleTexturedOpenGL/CMakeLists.txt +++ /dev/null @@ -1,50 +0,0 @@ -FIND_PACKAGE(OpenGL) -FIND_PACKAGE(GLUT) - -IF ( NOT GLUT_FOUND ) - IF ( MSVC ) - SET ( GLUT_FOUND 1 ) - SET ( GLUT_INCLUDE_DIR ${Assimp_SOURCE_DIR}/samples/freeglut/ ) - SET ( GLUT_LIBRARIES ${Assimp_SOURCE_DIR}/samples/freeglut/lib/freeglut.lib ) - ELSE () - MESSAGE( WARNING "Please install glut." ) - ENDIF () -ENDIF () - -if ( MSVC ) - ADD_DEFINITIONS( -D_SCL_SECURE_NO_WARNINGS ) - ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS ) -endif () - -INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/code - ${OPENGL_INCLUDE_DIR} - ${GLUT_INCLUDE_DIR} - ${SAMPLES_SHARED_CODE_DIR} -) - -LINK_DIRECTORIES( - ${Assimp_BINARY_DIR} - ${Assimp_BINARY_DIR}/lib/ -) - -ADD_EXECUTABLE( assimp_simpletexturedogl WIN32 - SimpleTexturedOpenGL/src/model_loading.cpp - ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.cpp - ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.h -) - -TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_simpletexturedogl) - -SET_PROPERTY(TARGET assimp_simpletexturedogl PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) - -TARGET_LINK_LIBRARIES( assimp_simpletexturedogl assimp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ) - -SET_TARGET_PROPERTIES( assimp_simpletexturedogl PROPERTIES - OUTPUT_NAME assimp_simpletexturedogl -) - -INSTALL( TARGETS assimp_simpletexturedogl - DESTINATION "${ASSIMP_BIN_INSTALL_DIR}" COMPONENT assimp-dev -) - diff --git a/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL.sln b/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL.sln deleted file mode 100644 index 2e2bae6..0000000 --- a/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimpleTexturedOpenGL", "SimpleTexturedOpenGL\SimpleTexturedOpenGL.vcproj", "{A03DCB69-BBC5-4F55-A7D1-B9100E821BBE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A03DCB69-BBC5-4F55-A7D1-B9100E821BBE}.Debug|Win32.ActiveCfg = Debug|Win32 - {A03DCB69-BBC5-4F55-A7D1-B9100E821BBE}.Debug|Win32.Build.0 = Debug|Win32 - {A03DCB69-BBC5-4F55-A7D1-B9100E821BBE}.Release|Win32.ActiveCfg = Release|Win32 - {A03DCB69-BBC5-4F55-A7D1-B9100E821BBE}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/SimpleTexturedOpenGL.vcproj b/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/SimpleTexturedOpenGL.vcproj deleted file mode 100644 index 885042d..0000000 --- a/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/SimpleTexturedOpenGL.vcproj +++ /dev/null @@ -1,206 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9,00" - Name="SimpleTexturedOpenGL" - ProjectGUID="{A03DCB69-BBC5-4F55-A7D1-B9100E821BBE}" - RootNamespace="SimpleTexturedOpenGL" - Keyword="Win32Proj" - TargetFrameworkVersion="196613" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories=".\include;..\..\DevIL\include;..\..\..\include" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="0" - WarningLevel="3" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="OpenGL32.lib GLu32.lib DevIL.lib assimp.lib" - OutputFile="$(OutDir)\$(ProjectName)_Debug.exe" - LinkIncremental="2" - AdditionalLibraryDirectories="..\..\DevIL\lib; ..\..\..\lib\assimp_debug-dll_win32" - GenerateDebugInformation="true" - SubSystem="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - CommandLine="copy "$(TargetDir)\$(TargetFileName)" ..\..\bin
copy ..\..\..\bin\assimp_debug-dll_Win32\Assimp32d.dll ..\..\bin
" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="2" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - EnableIntrinsicFunctions="true" - AdditionalIncludeDirectories=".\include;..\..\DevIL\include;..\..\..\include" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" - RuntimeLibrary="2" - EnableFunctionLevelLinking="true" - UsePrecompiledHeader="0" - WarningLevel="3" - DebugInformationFormat="3" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="OpenGL32.lib GLu32.lib DevIL.lib assimp.lib" - LinkIncremental="1" - AdditionalLibraryDirectories="..\..\DevIL\lib; ..\..\..\lib\assimp_release-dll_win32" - GenerateDebugInformation="true" - SubSystem="2" - OptimizeReferences="2" - EnableCOMDATFolding="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - CommandLine="copy "$(TargetDir)\$(TargetFileName)" ..\..\bin
copy ..\..\..\bin\assimp_release-dll_Win32\Assimp32.dll ..\..\bin
" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" - UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" - > - <File - RelativePath=".\src\model_loading.cpp" - > - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl;inc;xsd" - UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" - > - <File - RelativePath=".\include\boost_includes.h" - > - </File> - </Filter> - <Filter - Name="Resource Files" - Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" - UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" - > - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp b/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp deleted file mode 100644 index 48066f1..0000000 --- a/libs/assimp/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp +++ /dev/null @@ -1,915 +0,0 @@ -// ---------------------------------------------------------------------------- -// Another Assimp OpenGL sample including texturing. -// Note that it is very basic and will only read and apply the model's diffuse -// textures (by their material ids) -// -// Don't worry about the "Couldn't load Image: ...dwarf2.jpg" Message. -// It's caused by a bad texture reference in the model file (I guess) -// -// If you intend to _use_ this code sample in your app, do yourself a favour -// and replace immediate mode calls with VBOs ... -// -// Thanks to NeHe on whose OpenGL tutorials this one's based on! :) -// http://nehe.gamedev.net/ -// ---------------------------------------------------------------------------- -#include <windows.h> -#include <shellapi.h> -#include <stdio.h> -#include <GL/gl.h> -#include <GL/glu.h> - -#ifdef _MSC_VER -#pragma warning(disable: 4100) // Disable warning 'unreferenced formal parameter' -#endif // _MSC_VER - -#define STB_IMAGE_IMPLEMENTATION -#include "contrib/stb/stb_image.h" - -#ifdef _MSC_VER -#pragma warning(default: 4100) // Enable warning 'unreferenced formal parameter' -#endif // _MSC_VER - -#include <fstream> - -//to map image filenames to textureIds -#include <string.h> -#include <map> - -// assimp include files. These three are usually needed. -#include <assimp/Importer.hpp> -#include <assimp/postprocess.h> -#include <assimp/scene.h> -#include <assimp/DefaultLogger.hpp> -#include <assimp/LogStream.hpp> -#include "UTFConverter.h" - -// The default hard-coded path. Can be overridden by supplying a path through the command line. -static std::string modelpath = "../../test/models/OBJ/spider.obj"; - -HGLRC hRC=nullptr; // Permanent Rendering Context -HDC hDC=nullptr; // Private GDI Device Context -HWND g_hWnd=nullptr; // Holds Window Handle -HINSTANCE g_hInstance=nullptr; // Holds The Instance Of The Application - -bool keys[256]; // Array used for Keyboard Routine; -bool active=TRUE; // Window Active Flag Set To TRUE by Default -bool fullscreen=TRUE; // full-screen Flag Set To full-screen By Default - -GLfloat xrot; -GLfloat yrot; -GLfloat zrot; - - -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc -GLboolean abortGLInit(const char*); - -const char* windowTitle = "OpenGL Framework"; - -GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; -GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; -GLfloat LightPosition[]= { 0.0f, 0.0f, 15.0f, 1.0f }; - - - -// the global Assimp scene object -const aiScene* g_scene = nullptr; -GLuint scene_list = 0; -aiVector3D scene_min, scene_max, scene_center; - -// images / texture -std::map<std::string, GLuint*> textureIdMap; // map image filenames to textureIds -GLuint* textureIds; // pointer to texture Array - -// Create an instance of the Importer class -Assimp::Importer importer; - -using namespace AssimpSamples::SharedCode; - -void createAILogger() -{ - // Change this line to normal if you not want to analyse the import process - //Assimp::Logger::LogSeverity severity = Assimp::Logger::NORMAL; - Assimp::Logger::LogSeverity severity = Assimp::Logger::VERBOSE; - - // Create a logger instance for Console Output - Assimp::DefaultLogger::create("",severity, aiDefaultLogStream_STDOUT); - - // Create a logger instance for File Output (found in project folder or near .exe) - Assimp::DefaultLogger::create("assimp_log.txt",severity, aiDefaultLogStream_FILE); - - // Now I am ready for logging my stuff - Assimp::DefaultLogger::get()->info("this is my info-call"); -} - -void destroyAILogger() -{ - // Kill it after the work is done - Assimp::DefaultLogger::kill(); -} - -void logInfo(std::string logString) -{ - // Will add message to File with "info" Tag - Assimp::DefaultLogger::get()->info(logString.c_str()); -} - -void logDebug(const char* logString) -{ - // Will add message to File with "debug" Tag - Assimp::DefaultLogger::get()->debug(logString); -} - - -bool Import3DFromFile( const std::string& pFile) -{ - // Check if file exists - std::ifstream fin(pFile.c_str()); - if(!fin.fail()) - { - fin.close(); - } - else - { - MessageBox(nullptr, UTFConverter("Couldn't open file: " + pFile).c_wstr() , TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); - logInfo( importer.GetErrorString()); - return false; - } - - g_scene = importer.ReadFile(pFile, aiProcessPreset_TargetRealtime_Quality); - - // If the import failed, report it - if(!g_scene) - { - logInfo( importer.GetErrorString()); - return false; - } - - // Now we can access the file's contents. - logInfo("Import of scene " + pFile + " succeeded."); - - // We're done. Everything will be cleaned up by the importer destructor - return true; -} - -// Resize And Initialize The GL Window -void ReSizeGLScene(GLsizei width, GLsizei height) -{ - // Prevent A Divide By Zero By - if (height==0) - { - // Making Height Equal One - height=1; - } - - glViewport(0, 0, width, height); // Reset The Current Viewport - - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - - // Calculate The Aspect Ratio Of The Window - gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); - - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glLoadIdentity(); // Reset The Modelview Matrix -} - - -std::string getBasePath(const std::string& path) -{ - size_t pos = path.find_last_of("\\/"); - return (std::string::npos == pos) ? "" : path.substr(0, pos + 1); -} - -void freeTextureIds() -{ - textureIdMap.clear(); //no need to delete pointers in it manually here. (Pointers point to textureIds deleted in next step) - - if (textureIds) - { - delete[] textureIds; - textureIds = nullptr; - } -} - -int LoadGLTextures(const aiScene* scene) -{ - freeTextureIds(); - - //ILboolean success; - - /* Before calling ilInit() version should be checked. */ - /*if (ilGetInteger(IL_VERSION_NUM) < IL_VERSION) - { - /// wrong DevIL version /// - std::string err_msg = "Wrong DevIL version. Old devil.dll in system32/SysWow64?"; - char* cErr_msg = (char *) err_msg.c_str(); - abortGLInit(cErr_msg); - return -1; - }*/ - - //ilInit(); /* Initialization of DevIL */ - - if (scene->HasTextures()) return 1; - //abortGLInit("Support for meshes with embedded textures is not implemented"); - - /* getTexture Filenames and Numb of Textures */ - for (unsigned int m=0; m<scene->mNumMaterials; m++) - { - int texIndex = 0; - aiReturn texFound = AI_SUCCESS; - - aiString path; // filename - - while (texFound == AI_SUCCESS) - { - texFound = scene->mMaterials[m]->GetTexture(aiTextureType_DIFFUSE, texIndex, &path); - textureIdMap[path.data] = nullptr; //fill map with textures, pointers still NULL yet - texIndex++; - } - } - - const size_t numTextures = textureIdMap.size(); - - - /* array with DevIL image IDs */ - //ILuint* imageIds = NULL; -// imageIds = new ILuint[numTextures]; - - /* generate DevIL Image IDs */ -// ilGenImages(numTextures, imageIds); /* Generation of numTextures image names */ - - /* create and fill array with GL texture ids */ - textureIds = new GLuint[numTextures]; - glGenTextures(static_cast<GLsizei>(numTextures), textureIds); /* Texture name generation */ - - /* get iterator */ - std::map<std::string, GLuint*>::iterator itr = textureIdMap.begin(); - - std::string basepath = getBasePath(modelpath); - for (size_t i=0; i<numTextures; i++) - { - - //save IL image ID - std::string filename = (*itr).first; // get filename - (*itr).second = &textureIds[i]; // save texture id for filename in map - itr++; // next texture - - - //ilBindImage(imageIds[i]); /* Binding of DevIL image name */ - std::string fileloc = basepath + filename; /* Loading of image */ - //success = ilLoadImage(fileloc.c_str()); - int x, y, n; - unsigned char *data = stbi_load(fileloc.c_str(), &x, &y, &n, STBI_rgb_alpha); - - if (nullptr != data ) - { - // Convert every colour component into unsigned byte.If your image contains - // alpha channel you can replace IL_RGB with IL_RGBA - //success = ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE); - /*if (!success) - { - abortGLInit("Couldn't convert image"); - return -1; - }*/ - // Binding of texture name - glBindTexture(GL_TEXTURE_2D, textureIds[i]); - // redefine standard texture values - // We will use linear interpolation for magnification filter - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - // We will use linear interpolation for minifying filter - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - // Texture specification - glTexImage2D(GL_TEXTURE_2D, 0, n, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);// Texture specification. - - // we also want to be able to deal with odd texture dimensions - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); - stbi_image_free(data); - } - else - { - /* Error occurred */ - MessageBox(nullptr, UTFConverter("Couldn't load Image: " + fileloc).c_wstr(), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); - } - } - // Because we have already copied image data into texture data we can release memory used by image. -// ilDeleteImages(numTextures, imageIds); - - // Cleanup - //delete [] imageIds; - //imageIds = NULL; - - return TRUE; -} - -// All Setup For OpenGL goes here -int InitGL() -{ - if (!LoadGLTextures(g_scene)) - { - return FALSE; - } - - - glEnable(GL_TEXTURE_2D); - glShadeModel(GL_SMOOTH); // Enables Smooth Shading - glClearColor(1.0f, 1.0f, 1.0f, 0.0f); - glClearDepth(1.0f); // Depth Buffer Setup - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculation - - - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); // Uses default lighting parameters - glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); - glEnable(GL_NORMALIZE); - - glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); - glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); - glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); - glEnable(GL_LIGHT1); - - return TRUE; // Initialization Went OK -} - - -// Can't send color down as a pointer to aiColor4D because AI colors are ABGR. -void Color4f(const aiColor4D *color) -{ - glColor4f(color->r, color->g, color->b, color->a); -} - -void set_float4(float f[4], float a, float b, float c, float d) -{ - f[0] = a; - f[1] = b; - f[2] = c; - f[3] = d; -} - -void color4_to_float4(const aiColor4D *c, float f[4]) -{ - f[0] = c->r; - f[1] = c->g; - f[2] = c->b; - f[3] = c->a; -} - -void apply_material(const aiMaterial *mtl) -{ - float c[4]; - - GLenum fill_mode; - int ret1, ret2; - aiColor4D diffuse; - aiColor4D specular; - aiColor4D ambient; - aiColor4D emission; - ai_real shininess, strength; - int two_sided; - int wireframe; - unsigned int max; // changed: to unsigned - - int texIndex = 0; - aiString texPath; //contains filename of texture - - if(AI_SUCCESS == mtl->GetTexture(aiTextureType_DIFFUSE, texIndex, &texPath)) - { - //bind texture - unsigned int texId = *textureIdMap[texPath.data]; - glBindTexture(GL_TEXTURE_2D, texId); - } - - set_float4(c, 0.8f, 0.8f, 0.8f, 1.0f); - if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_DIFFUSE, &diffuse)) - color4_to_float4(&diffuse, c); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, c); - - set_float4(c, 0.0f, 0.0f, 0.0f, 1.0f); - if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_SPECULAR, &specular)) - color4_to_float4(&specular, c); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, c); - - set_float4(c, 0.2f, 0.2f, 0.2f, 1.0f); - if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_AMBIENT, &ambient)) - color4_to_float4(&ambient, c); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, c); - - set_float4(c, 0.0f, 0.0f, 0.0f, 1.0f); - if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_EMISSIVE, &emission)) - color4_to_float4(&emission, c); - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, c); - - max = 1; - ret1 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS, &shininess, &max); - max = 1; - ret2 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS_STRENGTH, &strength, &max); - if((ret1 == AI_SUCCESS) && (ret2 == AI_SUCCESS)) - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength); - else { - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f); - set_float4(c, 0.0f, 0.0f, 0.0f, 0.0f); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, c); - } - - max = 1; - if(AI_SUCCESS == aiGetMaterialIntegerArray(mtl, AI_MATKEY_ENABLE_WIREFRAME, &wireframe, &max)) - fill_mode = wireframe ? GL_LINE : GL_FILL; - else - fill_mode = GL_FILL; - glPolygonMode(GL_FRONT_AND_BACK, fill_mode); - - max = 1; - if((AI_SUCCESS == aiGetMaterialIntegerArray(mtl, AI_MATKEY_TWOSIDED, &two_sided, &max)) && two_sided) - glEnable(GL_CULL_FACE); - else - glDisable(GL_CULL_FACE); -} - - -void recursive_render (const struct aiScene *sc, const struct aiNode* nd, float scale) -{ - unsigned int i; - unsigned int n=0, t; - aiMatrix4x4 m = nd->mTransformation; - - aiMatrix4x4 m2; - aiMatrix4x4::Scaling(aiVector3D(scale, scale, scale), m2); - m = m * m2; - - // update transform - m.Transpose(); - glPushMatrix(); - glMultMatrixf((float*)&m); - - // draw all meshes assigned to this node - for (; n < nd->mNumMeshes; ++n) - { - const struct aiMesh* mesh = sc->mMeshes[nd->mMeshes[n]]; - - apply_material(sc->mMaterials[mesh->mMaterialIndex]); - - - if(mesh->mNormals == nullptr) - { - glDisable(GL_LIGHTING); - } - else - { - glEnable(GL_LIGHTING); - } - - if(mesh->mColors[0] != nullptr) - { - glEnable(GL_COLOR_MATERIAL); - } - else - { - glDisable(GL_COLOR_MATERIAL); - } - - for (t = 0; t < mesh->mNumFaces; ++t) { - const struct aiFace* face = &mesh->mFaces[t]; - GLenum face_mode; - - switch(face->mNumIndices) - { - case 1: face_mode = GL_POINTS; break; - case 2: face_mode = GL_LINES; break; - case 3: face_mode = GL_TRIANGLES; break; - default: face_mode = GL_POLYGON; break; - } - - glBegin(face_mode); - - for(i = 0; i < face->mNumIndices; i++) // go through all vertices in face - { - int vertexIndex = face->mIndices[i]; // get group index for current index - if(mesh->mColors[0] != nullptr) - Color4f(&mesh->mColors[0][vertexIndex]); - if(mesh->mNormals != nullptr) - - if(mesh->HasTextureCoords(0)) //HasTextureCoords(texture_coordinates_set) - { - glTexCoord2f(mesh->mTextureCoords[0][vertexIndex].x, 1 - mesh->mTextureCoords[0][vertexIndex].y); //mTextureCoords[channel][vertex] - } - - glNormal3fv(&mesh->mNormals[vertexIndex].x); - glVertex3fv(&mesh->mVertices[vertexIndex].x); - } - glEnd(); - } - } - - // draw all children - for (n = 0; n < nd->mNumChildren; ++n) - { - recursive_render(sc, nd->mChildren[n], scale); - } - - glPopMatrix(); -} - - -void drawAiScene(const aiScene* scene) -{ - logInfo("drawing objects"); - - recursive_render(scene, scene->mRootNode, 0.5); - -} - -int DrawGLScene() //Here's where we do all the drawing -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer - glLoadIdentity(); // Reset MV Matrix - - - glTranslatef(0.0f, -10.0f, -40.0f); // Move 40 Units And Into The Screen - - - glRotatef(xrot, 1.0f, 0.0f, 0.0f); - glRotatef(yrot, 0.0f, 1.0f, 0.0f); - glRotatef(zrot, 0.0f, 0.0f, 1.0f); - - drawAiScene(g_scene); - - //xrot+=0.3f; - yrot+=0.2f; - //zrot+=0.4f; - - return TRUE; // okay -} - - -void KillGLWindow() // Properly Kill The Window -{ - if (fullscreen) // Are We In Fullscreen Mode? - { - ChangeDisplaySettings(nullptr, 0); // If So Switch Back To The Desktop - ShowCursor(TRUE); // Show Mouse Pointer - } - - if (hRC) // Do We Have A Rendering Context? - { - if (!wglMakeCurrent(nullptr, nullptr)) // Are We Able To Release The DC And RC Contexts? - { - MessageBox(nullptr, TEXT("Release Of DC And RC Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - } - - if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC? - { - MessageBox(nullptr, TEXT("Release Rendering Context Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - } - hRC = nullptr; - } - - if (hDC) - { - if (!ReleaseDC(g_hWnd, hDC)) // Are We able to Release The DC? - MessageBox(nullptr, TEXT("Release Device Context Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - hDC = nullptr; - } - - if (g_hWnd) - { - if (!DestroyWindow(g_hWnd)) // Are We Able To Destroy The Window - MessageBox(nullptr, TEXT("Could Not Release hWnd."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - g_hWnd = nullptr; - } - - if (g_hInstance) - { - if (!UnregisterClass(TEXT("OpenGL"), g_hInstance)) // Are We Able To Unregister Class - MessageBox(nullptr, TEXT("Could Not Unregister Class."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - g_hInstance = nullptr; - } -} - -GLboolean abortGLInit(const char* abortMessage) -{ - KillGLWindow(); // Reset Display - MessageBox(nullptr, UTFConverter(abortMessage).c_wstr(), TEXT("ERROR"), MB_OK|MB_ICONEXCLAMATION); - return FALSE; // quit and return False -} - -BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool fullscreenflag) -{ - GLuint PixelFormat; // Hold the result after searching for a match - WNDCLASS wc; // Window Class Structure - DWORD dwExStyle; // Window Extended Style - DWORD dwStyle; // Window Style - RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values - WindowRect.left = (long)0; - WindowRect.right = (long)width; - WindowRect.top = (long)0; - WindowRect.bottom = (long)height; - - fullscreen = fullscreenflag; - - g_hInstance = GetModuleHandle(nullptr); // Grab An Instance For Our Window - wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Move, And Own DC For Window - wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc handles Messages - wc.cbClsExtra = 0; // No Extra Window Data - wc.cbWndExtra = 0; // No Extra Window Data - wc.hInstance = g_hInstance; - wc.hIcon = LoadIcon(nullptr, IDI_WINLOGO); // Load The Default Icon - wc.hCursor = LoadCursor(nullptr, IDC_ARROW); // Load the default arrow - wc.hbrBackground= nullptr; // No Background required for OpenGL - wc.lpszMenuName = nullptr; // No Menu - wc.lpszClassName= TEXT("OpenGL"); // Class Name - - if (!RegisterClass(&wc)) - { - MessageBox(nullptr, TEXT("Failed to register the window class"), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); - return FALSE; //exit and return false - } - - if (fullscreen) // attempt fullscreen mode - { - DEVMODE dmScreenSettings; // Device Mode - memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); // Make Sure Memory's Cleared - dmScreenSettings.dmSize = sizeof(dmScreenSettings); // Size Of the devmode structure - dmScreenSettings.dmPelsWidth = width; // Selected Screen Width - dmScreenSettings.dmPelsHeight = height; // Selected Screen Height - dmScreenSettings.dmBitsPerPel = bits; // bits per pixel - dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; - - // Try To Set Selected Mode and Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. - if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) - { - // If The Mode Fails, Offer Two Options. Quit Or Run In A Window. - if (MessageBox(nullptr,TEXT("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"),TEXT("NeHe GL"),MB_YESNO|MB_ICONEXCLAMATION)==IDYES) - { - fullscreen = FALSE; // Select Windowed Mode (Fullscreen = FALSE) - } - else - { - //Popup Messagebox: Closing - MessageBox(nullptr, TEXT("Program will close now."), TEXT("ERROR"), MB_OK|MB_ICONSTOP); - return FALSE; //exit, return false - } - } - } - - if (fullscreen) // when mode really succeeded - { - dwExStyle=WS_EX_APPWINDOW; // Window Extended Style - dwStyle=WS_POPUP; - ShowCursor(FALSE); - } - else - { - dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window extended style - dwStyle=WS_OVERLAPPEDWINDOW; // Windows style - } - - AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size - - if (nullptr == (g_hWnd=CreateWindowEx(dwExStyle, // Extended Style For The Window - TEXT("OpenGL"), // Class Name - UTFConverter(title).c_wstr(), // Window Title - WS_CLIPSIBLINGS | // Required Window Style - WS_CLIPCHILDREN | // Required Window Style - dwStyle, // Selected WIndow Style - 0, 0, // Window Position - WindowRect.right-WindowRect.left, // Calc adjusted Window Width - WindowRect.bottom-WindowRect.top, // Calc adjustes Window Height - nullptr, // No Parent Window - nullptr, // No Menu - g_hInstance, // Instance - nullptr ))) // Don't pass anything To WM_CREATE - { - abortGLInit("Window Creation Error."); - return FALSE; - } - - static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be - { - sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor - 1, // Version Number - PFD_DRAW_TO_WINDOW | // Format Must Support Window - PFD_SUPPORT_OPENGL | // Format Must Support OpenGL - PFD_DOUBLEBUFFER, // Must Support Double Buffering - PFD_TYPE_RGBA, // Request An RGBA Format - BYTE(bits), // Select Our Color Depth - 0, 0, 0, 0, 0, 0, // Color Bits Ignored - 0, // No Alpha Buffer - 0, // Shift Bit Ignored - 0, // No Accumulation Buffer - 0, 0, 0, 0, // Accumulation Bits Ignored - 16, // 16Bit Z-Buffer (Depth Buffer) - 0, // No Stencil Buffer - 0, // No Auxiliary Buffer - PFD_MAIN_PLANE, // Main Drawing Layer - 0, // Reserved - 0, 0, 0 // Layer Masks Ignored - }; - - if (nullptr == (hDC=GetDC(g_hWnd))) // Did we get the Device Context? - { - abortGLInit("Can't Create A GL Device Context."); - return FALSE; - } - - if (0 == (PixelFormat=ChoosePixelFormat(hDC, &pfd))) // Did We Find a matching pixel Format? - { - abortGLInit("Can't Find Suitable PixelFormat"); - return FALSE; - } - - if (!SetPixelFormat(hDC, PixelFormat, &pfd)) - { - abortGLInit("Can't Set The PixelFormat"); - return FALSE; - } - - if (nullptr == (hRC=wglCreateContext(hDC))) - { - abortGLInit("Can't Create A GL Rendering Context."); - return FALSE; - } - - if (!(wglMakeCurrent(hDC,hRC))) // Try to activate the rendering context - { - abortGLInit("Can't Activate The Rendering Context"); - return FALSE; - } - - //// *** everything okay *** - - ShowWindow(g_hWnd, SW_SHOW); // Show The Window - SetForegroundWindow(g_hWnd); // Slightly Higher Prio - SetFocus(g_hWnd); // Sets Keyboard Focus To The Window - ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen - - if (!InitGL()) - { - abortGLInit("Initialization failed"); - return FALSE; - } - - return TRUE; -} - -void cleanup() -{ - freeTextureIds(); - - destroyAILogger(); - - if (g_hWnd) - KillGLWindow(); -} - -LRESULT CALLBACK WndProc(HWND hWnd, // Handles for this Window - UINT uMsg, // Message for this Window - WPARAM wParam, // additional message Info - LPARAM lParam) // additional message Info -{ - switch (uMsg) // check for Window Messages - { - case WM_ACTIVATE: // Watch For Window Activate Message - { - if (!HIWORD(wParam)) // Check Minimization State - { - active=TRUE; - } - else - { - active=FALSE; - } - - return 0; // return To The Message Loop - } - - case WM_SYSCOMMAND: // Interrupt System Commands - { - switch (wParam) - { - case SC_SCREENSAVE: // Screen-saver trying to start - case SC_MONITORPOWER: // Monitor trying to enter power-safe - return 0; - } - break; - } - - case WM_CLOSE: // close message received? - { - PostQuitMessage(0); // Send WM_QUIT quit message - return 0; // Jump Back - } - - case WM_KEYDOWN: // Is a key pressed? - { - keys[wParam] = TRUE; // If so, Mark it as true - return 0; - } - - case WM_KEYUP: // Has Key Been released? - { - keys[wParam] = FALSE; // If so, Mark It As FALSE - return 0; - } - - case WM_SIZE: // Resize The OpenGL Window - { - ReSizeGLScene(LOWORD(lParam), HIWORD(lParam)); // LoWord-Width, HiWord-Height - return 0; - } - } - - // Pass All unhandled Messaged To DefWindowProc - return DefWindowProc(hWnd, uMsg, wParam, lParam); -} - -int WINAPI WinMain( HINSTANCE /*hInstance*/, // The instance - HINSTANCE /*hPrevInstance*/, // Previous instance - LPSTR /*lpCmdLine*/, // Command Line Parameters - int /*nShowCmd*/ ) // Window Show State -{ - MSG msg = {}; - BOOL done=FALSE; - - createAILogger(); - logInfo("App fired!"); - - // Check the command line for an override file path. - int argc; - LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); - if (argv != nullptr && argc > 1) - { - std::wstring modelpathW(argv[1]); - modelpath = UTFConverter(modelpathW).str(); - } - - if (!Import3DFromFile(modelpath)) - { - cleanup(); - return 0; - } - - logInfo("=============== Post Import ===================="); - - if (MessageBox(nullptr, TEXT("Would You Like To Run In Fullscreen Mode?"), TEXT("Start Fullscreen?"), MB_YESNO|MB_ICONEXCLAMATION)==IDNO) - { - fullscreen=FALSE; - } - - if (!CreateGLWindow(windowTitle, 640, 480, 16, fullscreen)) - { - cleanup(); - return 0; - } - - while(!done) // Game Loop - { - if (PeekMessage(&msg, nullptr, 0,0, PM_REMOVE)) - { - if (msg.message==WM_QUIT) - { - done=TRUE; - } - else - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - else - { - // Draw The Scene. Watch For ESC Key And Quit Messaged From DrawGLScene() - if (active) - { - if (keys[VK_ESCAPE]) - { - done=TRUE; - } - else - { - DrawGLScene(); - SwapBuffers(hDC); - } - } - - if (keys[VK_F1]) - { - keys[VK_F1]=FALSE; - KillGLWindow(); - fullscreen=!fullscreen; - if (!CreateGLWindow(windowTitle, 640, 480, 16, fullscreen)) - { - cleanup(); - return 0; - } - } - } - } - - // *** cleanup *** - cleanup(); - return static_cast<int>(msg.wParam); -} |