From 3c534a9b983a3dccbf08bd6d56c5b3e2170d0bf3 Mon Sep 17 00:00:00 2001 From: kts Date: Wed, 4 Mar 2015 00:59:46 -0800 Subject: [PATCH] SDL2_image is now used. OMesh::loadObj now ensures that UVs and normals are created equal to the # of vertices - this is not exactly right, as it simply zeros values that don't exist, but it's better than nothing. Vertex indexing should be implemented using GL_DRAW_ELEMENTS, but for now we'll deal. Default cube now generates proper normals and uvs attached to triangular faces. GLSL vertex shaders now flip the outputted fragment UV (1.0 - uv.t). The Texture class has been created which is responsible for turning some image format data into an OpenGL texture. It handles things similarly to Mesh, in that it first loads the data then has to be 'built'. --- build/android/jni/SDL2_image | 1 + build/android/jni/src/Android.mk | 6 +- .../src/org/libsdl/app/SDLActivity.java | 2 +- .../Roll them Bones.xcodeproj/project.pbxproj | 71 ++++++++++++++ build/ios/SDL2_image | 1 + .../Roll them Bones.xcodeproj/project.pbxproj | 31 ++++++ data/models/cube.obj | 46 ++++++--- data/shaders/default_fs.100.glsl | 4 +- data/shaders/default_fs.glsl | 4 +- data/shaders/default_vs.100.glsl | 5 +- data/shaders/default_vs.glsl | 3 +- data/textures/cube.png | Bin 0 -> 22648 bytes src/Mesh.cpp | 24 ++++- src/RenderObject.cpp | 6 +- src/RenderObject.hpp | 6 +- src/RenderScene.cpp | 17 +++- src/Texture.cpp | 90 ++++++++++++++++++ src/Texture.hpp | 30 ++++++ src/main.cpp | 2 + src/states/TestState.cpp | 7 ++ 20 files changed, 325 insertions(+), 31 deletions(-) create mode 120000 build/android/jni/SDL2_image create mode 120000 build/ios/SDL2_image create mode 100644 data/textures/cube.png create mode 100644 src/Texture.cpp create mode 100644 src/Texture.hpp diff --git a/build/android/jni/SDL2_image b/build/android/jni/SDL2_image new file mode 120000 index 0000000..2291953 --- /dev/null +++ b/build/android/jni/SDL2_image @@ -0,0 +1 @@ +../../../../android/SDL2_image \ No newline at end of file diff --git a/build/android/jni/src/Android.mk b/build/android/jni/src/Android.mk index 0c3810f..f28e889 100755 --- a/build/android/jni/src/Android.mk +++ b/build/android/jni/src/Android.mk @@ -5,8 +5,10 @@ include $(CLEAR_VARS) LOCAL_MODULE := main SDL_PATH := ../SDL2 +SDL_IMAGE_PATH := ../SDL2_image LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include +LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_IMAGE_PATH) LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../src LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../src/states LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../src/gui @@ -19,6 +21,8 @@ LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \ ../../../../src/Mat4.hpp \ ../../../../src/Mesh.cpp \ ../../../../src/Mesh.hpp \ + ../../../../src/Texture.cpp \ + ../../../../src/Texture.hpp \ ../../../../src/RenderCamera.cpp \ ../../../../src/RenderCamera.hpp \ ../../../../src/RenderObject.cpp \ @@ -60,7 +64,7 @@ LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \ ../../../../src/gui/GuiElement.hpp \ ../../../../src/main.cpp -LOCAL_SHARED_LIBRARIES := SDL2 +LOCAL_SHARED_LIBRARIES := SDL2 SDL2_image LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog -landroid diff --git a/build/android/src/org/libsdl/app/SDLActivity.java b/build/android/src/org/libsdl/app/SDLActivity.java index 49a1d38..a26b6e7 100755 --- a/build/android/src/org/libsdl/app/SDLActivity.java +++ b/build/android/src/org/libsdl/app/SDLActivity.java @@ -47,7 +47,7 @@ public class SDLActivity extends Activity { // Load the .so static { System.loadLibrary("SDL2"); - //System.loadLibrary("SDL2_image"); + System.loadLibrary("SDL2_image"); //System.loadLibrary("SDL2_mixer"); //System.loadLibrary("SDL2_net"); //System.loadLibrary("SDL2_ttf"); diff --git a/build/ios/Roll them Bones.xcodeproj/project.pbxproj b/build/ios/Roll them Bones.xcodeproj/project.pbxproj index 9ae9a52..7487b40 100755 --- a/build/ios/Roll them Bones.xcodeproj/project.pbxproj +++ b/build/ios/Roll them Bones.xcodeproj/project.pbxproj @@ -32,6 +32,12 @@ 205723E11A9B4053001400FA /* chest.obj in Resources */ = {isa = PBXBuildFile; fileRef = 205723DB1A9B4053001400FA /* chest.obj */; }; 2078E3811AA5CE4700172D34 /* GuiElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2078E37F1AA5CE4700172D34 /* GuiElement.cpp */; }; 2078E3841AA5CE5500172D34 /* Gui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2078E3821AA5CE5500172D34 /* Gui.cpp */; }; + 208B63BF1AA69C28008D37B5 /* libSDL2_image.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 208B63BE1AA69C28008D37B5 /* libSDL2_image.a */; }; + 208B64331AA6B8C4008D37B5 /* cube.png in Resources */ = {isa = PBXBuildFile; fileRef = 208B64321AA6B8C4008D37B5 /* cube.png */; }; + 208B64361AA6B8FD008D37B5 /* cube.png in Copy Textures */ = {isa = PBXBuildFile; fileRef = 208B64321AA6B8C4008D37B5 /* cube.png */; }; + 208B64421AA6B93E008D37B5 /* Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 208B64401AA6B93E008D37B5 /* Texture.cpp */; }; + 208B64551AA6B9D4008D37B5 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 208B64541AA6B9D4008D37B5 /* ImageIO.framework */; }; + 208B645E1AA6B9F7008D37B5 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 208B645D1AA6B9F7008D37B5 /* MobileCoreServices.framework */; }; 20A7A91D1A89F91300EDC1A0 /* RenderCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20A7A9151A89F91300EDC1A0 /* RenderCamera.cpp */; }; 20A7A91E1A89F91300EDC1A0 /* RenderScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20A7A9171A89F91300EDC1A0 /* RenderScene.cpp */; }; 20A7A91F1A89F91300EDC1A0 /* RenderSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20A7A9191A89F91300EDC1A0 /* RenderSet.cpp */; }; @@ -80,6 +86,17 @@ name = "Copy Shaders"; runOnlyForDeploymentPostprocessing = 0; }; + 208B64351AA6B8EB008D37B5 /* Copy Textures */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = data/textures; + dstSubfolderSpec = 7; + files = ( + 208B64361AA6B8FD008D37B5 /* cube.png in Copy Textures */, + ); + name = "Copy Textures"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -171,6 +188,13 @@ 2078E3801AA5CE4700172D34 /* GuiElement.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = GuiElement.hpp; path = ../../src/gui/GuiElement.hpp; sourceTree = SOURCE_ROOT; }; 2078E3821AA5CE5500172D34 /* Gui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Gui.cpp; path = ../../src/Gui.cpp; sourceTree = SOURCE_ROOT; }; 2078E3831AA5CE5500172D34 /* Gui.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Gui.hpp; path = ../../src/Gui.hpp; sourceTree = SOURCE_ROOT; }; + 208B63B41AA69BEE008D37B5 /* SDL_image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_image.h; path = ../../../android/SDL2_image/SDL_image.h; sourceTree = SOURCE_ROOT; }; + 208B63BE1AA69C28008D37B5 /* libSDL2_image.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSDL2_image.a; path = ../../../android/SDL2_image/libSDL2_image.a; sourceTree = SOURCE_ROOT; }; + 208B64321AA6B8C4008D37B5 /* cube.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = cube.png; path = textures/cube.png; sourceTree = ""; }; + 208B64401AA6B93E008D37B5 /* Texture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Texture.cpp; path = ../../src/Texture.cpp; sourceTree = SOURCE_ROOT; }; + 208B64411AA6B93E008D37B5 /* Texture.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Texture.hpp; path = ../../src/Texture.hpp; sourceTree = SOURCE_ROOT; }; + 208B64541AA6B9D4008D37B5 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; + 208B645D1AA6B9F7008D37B5 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 20A7A9151A89F91300EDC1A0 /* RenderCamera.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RenderCamera.cpp; path = ../../src/RenderCamera.cpp; sourceTree = SOURCE_ROOT; }; 20A7A9161A89F91300EDC1A0 /* RenderCamera.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = RenderCamera.hpp; path = ../../src/RenderCamera.hpp; sourceTree = SOURCE_ROOT; }; 20A7A9171A89F91300EDC1A0 /* RenderScene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RenderScene.cpp; path = ../../src/RenderScene.cpp; sourceTree = SOURCE_ROOT; }; @@ -220,6 +244,9 @@ FD77A0850E26BDB800F39101 /* AudioToolbox.framework in Frameworks */, FDB8BFC60E5A0F6A00980157 /* CoreGraphics.framework in Frameworks */, 0097E2D912F70C4E00724AC5 /* libSDL2.a in Frameworks */, + 208B63BF1AA69C28008D37B5 /* libSDL2_image.a in Frameworks */, + 208B64551AA6B9D4008D37B5 /* ImageIO.framework in Frameworks */, + 208B645E1AA6B9F7008D37B5 /* MobileCoreServices.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -319,6 +346,7 @@ 205723D91A9B4053001400FA /* data */ = { isa = PBXGroup; children = ( + 208B64311AA6B8B7008D37B5 /* textures */, 205723DC1A9B4053001400FA /* shaders */, 205723DA1A9B4053001400FA /* models */, ); @@ -356,9 +384,44 @@ name = Gui; sourceTree = ""; }; + 208B63B21AA69BAB008D37B5 /* SDL2_image */ = { + isa = PBXGroup; + children = ( + 208B63B31AA69BE2008D37B5 /* include */, + 208B63B51AA69BF3008D37B5 /* lib */, + ); + name = SDL2_image; + sourceTree = ""; + }; + 208B63B31AA69BE2008D37B5 /* include */ = { + isa = PBXGroup; + children = ( + 208B63B41AA69BEE008D37B5 /* SDL_image.h */, + ); + name = include; + sourceTree = ""; + }; + 208B63B51AA69BF3008D37B5 /* lib */ = { + isa = PBXGroup; + children = ( + 208B63BE1AA69C28008D37B5 /* libSDL2_image.a */, + ); + name = lib; + sourceTree = ""; + }; + 208B64311AA6B8B7008D37B5 /* textures */ = { + isa = PBXGroup; + children = ( + 208B64321AA6B8C4008D37B5 /* cube.png */, + ); + name = textures; + sourceTree = ""; + }; 20A7A9131A89F8F600EDC1A0 /* Classes */ = { isa = PBXGroup; children = ( + 208B64401AA6B93E008D37B5 /* Texture.cpp */, + 208B64411AA6B93E008D37B5 /* Texture.hpp */, 2078E3821AA5CE5500172D34 /* Gui.cpp */, 2078E3831AA5CE5500172D34 /* Gui.hpp */, 2078E37E1AA5CE3700172D34 /* Gui */, @@ -427,8 +490,11 @@ 20A7A9221A89F91B00EDC1A0 /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 0097E29812F70C4D00724AC5 /* SDL */, + 208B63B21AA69BAB008D37B5 /* SDL2_image */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, + 208B64541AA6B9D4008D37B5 /* ImageIO.framework */, + 208B645D1AA6B9F7008D37B5 /* MobileCoreServices.framework */, ); name = CustomTemplate; sourceTree = ""; @@ -481,6 +547,7 @@ 1D60588F0D05DD3D006BFB54 /* Frameworks */, 20517CBD1A9B411300DE49E9 /* Copy Models */, 20517CBE1A9B411300DE49E9 /* Copy Shaders */, + 208B64351AA6B8EB008D37B5 /* Copy Textures */, ); buildRules = ( ); @@ -528,6 +595,7 @@ 20517D181A9B449200DE49E9 /* fb_fs.100.glsl in Resources */, 20517D191A9B449200DE49E9 /* fb_vs.100.glsl in Resources */, 205183891A9DE71F00DE49E9 /* cube.obj in Resources */, + 208B64331AA6B8C4008D37B5 /* cube.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -560,6 +628,7 @@ 20FC425D1AA56A150083B64C /* TestState.cpp in Sources */, 2078E3811AA5CE4700172D34 /* GuiElement.cpp in Sources */, 2078E3841AA5CE5500172D34 /* Gui.cpp in Sources */, + 208B64421AA6B93E008D37B5 /* Texture.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -579,6 +648,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/SDL/lib\"", + "\"$(SRCROOT)/../../../android/SDL2_image\"", ); PRODUCT_NAME = "Roll them Bones"; }; @@ -595,6 +665,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/SDL/lib\"", + "\"$(SRCROOT)/../../../android/SDL2_image\"", ); PRODUCT_NAME = "___PROJECTNAME___"; }; diff --git a/build/ios/SDL2_image b/build/ios/SDL2_image new file mode 120000 index 0000000..a58abfd --- /dev/null +++ b/build/ios/SDL2_image @@ -0,0 +1 @@ +../../../android/SDL2_image \ No newline at end of file diff --git a/build/osx/Roll them Bones.xcodeproj/project.pbxproj b/build/osx/Roll them Bones.xcodeproj/project.pbxproj index 8f03a1b..3720d3d 100644 --- a/build/osx/Roll them Bones.xcodeproj/project.pbxproj +++ b/build/osx/Roll them Bones.xcodeproj/project.pbxproj @@ -30,6 +30,9 @@ 205D370C1A674B1D00C05BD8 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 205D370B1A674B1D00C05BD8 /* OpenGL.framework */; }; 206662951A9305FF00631FC0 /* fb_fs.glsl in Copy Shaders */ = {isa = PBXBuildFile; fileRef = 209930A31A92CAB10089E661 /* fb_fs.glsl */; }; 206662961A9305FF00631FC0 /* fb_vs.glsl in Copy Shaders */ = {isa = PBXBuildFile; fileRef = 209930A41A92CAB10089E661 /* fb_vs.glsl */; }; + 208B63C51AA6A8B2008D37B5 /* Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 208B63C31AA6A8B2008D37B5 /* Texture.cpp */; }; + 208B63F21AA6B2F6008D37B5 /* cube.png in Resources */ = {isa = PBXBuildFile; fileRef = 208B63F11AA6B2F6008D37B5 /* cube.png */; }; + 208B63FB1AA6B32E008D37B5 /* cube.png in Copy Textures */ = {isa = PBXBuildFile; fileRef = 208B63F11AA6B2F6008D37B5 /* cube.png */; }; 209930831A92ADB00089E661 /* Program.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 209930811A92ADB00089E661 /* Program.cpp */; }; 20A7A8D51A89E11200EDC1A0 /* RenderScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20A7A8D11A89E11200EDC1A0 /* RenderScene.cpp */; }; 20A7A8D61A89E11200EDC1A0 /* RenderSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20A7A8D31A89E11200EDC1A0 /* RenderSet.cpp */; }; @@ -58,6 +61,17 @@ name = "Copy Models"; runOnlyForDeploymentPostprocessing = 0; }; + 208B64081AA6B343008D37B5 /* Copy Textures */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = data/textures; + dstSubfolderSpec = 7; + files = ( + 208B63FB1AA6B32E008D37B5 /* cube.png in Copy Textures */, + ); + name = "Copy Textures"; + runOnlyForDeploymentPostprocessing = 0; + }; 209930BA1A92CB1C0089E661 /* Copy Shaders */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -103,6 +117,9 @@ 205723A01A9B3F04001400FA /* Quat.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Quat.hpp; path = ../../src/Quat.hpp; sourceTree = SOURCE_ROOT; }; 205D36CD1A6749FB00C05BD8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../../src/main.cpp; sourceTree = SOURCE_ROOT; }; 205D370B1A674B1D00C05BD8 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + 208B63C31AA6A8B2008D37B5 /* Texture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Texture.cpp; path = ../../src/Texture.cpp; sourceTree = SOURCE_ROOT; }; + 208B63C41AA6A8B2008D37B5 /* Texture.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Texture.hpp; path = ../../src/Texture.hpp; sourceTree = SOURCE_ROOT; }; + 208B63F11AA6B2F6008D37B5 /* cube.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = cube.png; path = textures/cube.png; sourceTree = ""; }; 209930811A92ADB00089E661 /* Program.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Program.cpp; path = ../../src/Program.cpp; sourceTree = SOURCE_ROOT; }; 209930821A92ADB00089E661 /* Program.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Program.hpp; path = ../../src/Program.hpp; sourceTree = SOURCE_ROOT; }; 209930A31A92CAB10089E661 /* fb_fs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fb_fs.glsl; sourceTree = ""; }; @@ -151,6 +168,8 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + 208B63C31AA6A8B2008D37B5 /* Texture.cpp */, + 208B63C41AA6A8B2008D37B5 /* Texture.hpp */, 20FC42861AA5BFF50083B64C /* Gui */, 20FC42631AA587F10083B64C /* Gui.cpp */, 20FC42641AA587F10083B64C /* Gui.hpp */, @@ -245,9 +264,18 @@ usesTabs = 0; wrapsLines = 1; }; + 208B63F01AA6B2ED008D37B5 /* textures */ = { + isa = PBXGroup; + children = ( + 208B63F11AA6B2F6008D37B5 /* cube.png */, + ); + name = textures; + sourceTree = ""; + }; 2099309F1A92CAB10089E661 /* data */ = { isa = PBXGroup; children = ( + 208B63F01AA6B2ED008D37B5 /* textures */, 205723721A9B3E90001400FA /* models */, 209930A01A92CAB10089E661 /* shaders */, ); @@ -339,6 +367,7 @@ 8D11072E0486CEB800E47090 /* Frameworks */, 209930BA1A92CB1C0089E661 /* Copy Shaders */, 204FF23E1A93F28B0006E1F0 /* Copy Models */, + 208B64081AA6B343008D37B5 /* Copy Textures */, ); buildRules = ( ); @@ -386,6 +415,7 @@ 2057237B1A9B3EB2001400FA /* default_fs.glsl in Resources */, 2057237C1A9B3EB2001400FA /* default_vs.glsl in Resources */, 205182A81A9DD62C00DE49E9 /* cube.obj in Resources */, + 208B63F21AA6B2F6008D37B5 /* cube.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -418,6 +448,7 @@ 20FC42581AA569FB0083B64C /* TestState.cpp in Sources */, 20FC42651AA587F10083B64C /* Gui.cpp in Sources */, 20FC42891AA5C00A0083B64C /* GuiElement.cpp in Sources */, + 208B63C51AA6A8B2008D37B5 /* Texture.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/data/models/cube.obj b/data/models/cube.obj index 3a60902..cdeb621 100644 --- a/data/models/cube.obj +++ b/data/models/cube.obj @@ -1,4 +1,4 @@ -# Blender v2.69 (sub 0) OBJ File: '' +# Blender v2.72 (sub 0) OBJ File: '' # www.blender.org o Cube v 1.000000 -1.000000 -1.000000 @@ -9,16 +9,36 @@ v 1.000000 1.000000 -0.999999 v 0.999999 1.000000 1.000001 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000 +vt 0.606653 0.502138 +vt 0.606653 0.743570 +vt 0.365222 0.743570 +vt 0.365222 0.019274 +vt 0.606653 0.019274 +vt 0.606653 0.260706 +vt 0.365222 0.502138 +vt 0.365222 0.260706 +vt 0.848085 0.502138 +vt 0.848085 0.743570 +vt 0.606653 0.985002 +vt 0.365222 0.985002 +vt 0.123790 0.743570 +vt 0.123790 0.502138 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn -0.000000 -0.000000 1.000000 +vn -1.000000 -0.000000 -0.000000 +vn 0.000000 0.000000 -1.000000 s off -f 1 2 4 -f 5 8 6 -f 1 5 2 -f 2 6 3 -f 3 7 4 -f 5 1 8 -f 2 3 4 -f 8 7 6 -f 5 6 2 -f 6 7 3 -f 7 8 4 -f 1 4 8 +f 2/1/1 3/2/1 4/3/1 +f 8/4/2 7/5/2 6/6/2 +f 1/7/3 5/8/3 6/6/3 +f 2/1/4 6/9/4 7/10/4 +f 7/11/5 8/12/5 4/3/5 +f 1/7/6 4/3/6 8/13/6 +f 1/7/1 2/1/1 4/3/1 +f 5/8/2 8/4/2 6/6/2 +f 2/1/3 1/7/3 6/6/3 +f 3/2/4 2/1/4 7/10/4 +f 3/2/5 7/11/5 4/3/5 +f 5/14/6 1/7/6 8/13/6 diff --git a/data/shaders/default_fs.100.glsl b/data/shaders/default_fs.100.glsl index 5056a67..84293b1 100644 --- a/data/shaders/default_fs.100.glsl +++ b/data/shaders/default_fs.100.glsl @@ -6,6 +6,6 @@ uniform sampler2D texture_sampler; varying vec2 frag_uv; void main() { - //gl_FragColor = texture2D(texture_sampler, frag_uv); - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + gl_FragColor = texture2D(texture_sampler, frag_uv); + //gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); } diff --git a/data/shaders/default_fs.glsl b/data/shaders/default_fs.glsl index e5ca333..0836768 100644 --- a/data/shaders/default_fs.glsl +++ b/data/shaders/default_fs.glsl @@ -5,6 +5,6 @@ uniform sampler2D texture_sampler; varying vec2 frag_uv; void main() { - //gl_FragColor = texture2D(texture_sampler, frag_uv); - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + gl_FragColor = texture2D(texture_sampler, frag_uv); + //gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); } diff --git a/data/shaders/default_vs.100.glsl b/data/shaders/default_vs.100.glsl index f03c1e8..2ba9af1 100644 --- a/data/shaders/default_vs.100.glsl +++ b/data/shaders/default_vs.100.glsl @@ -12,5 +12,6 @@ varying vec2 frag_uv; void main() { vec4 eye = mv_matrix * vec4(vp, 1.0); gl_Position = proj_matrix * eye; - frag_uv = uv; -} \ No newline at end of file + // 1.0 - uv.t = flipped texture + frag_uv = vec2(uv.s, 1.0 - uv.t); +} diff --git a/data/shaders/default_vs.glsl b/data/shaders/default_vs.glsl index 31a4a0e..ffb8620 100644 --- a/data/shaders/default_vs.glsl +++ b/data/shaders/default_vs.glsl @@ -12,5 +12,6 @@ varying vec2 frag_uv; void main() { vec4 eye = mv_matrix * vec4(vp, 1.0); gl_Position = proj_matrix * eye; - frag_uv = uv; + // 1.0 - uv.t = flipped texture + frag_uv = vec2(uv.s, 1.0 - uv.t); } diff --git a/data/textures/cube.png b/data/textures/cube.png new file mode 100644 index 0000000000000000000000000000000000000000..f70694c8fd8f0748ac1bc162ff0320a59054cb81 GIT binary patch literal 22648 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 F{{>hewwnL| literal 0 HcmV?d00001 diff --git a/src/Mesh.cpp b/src/Mesh.cpp index 758f99e..cc025bf 100644 --- a/src/Mesh.cpp +++ b/src/Mesh.cpp @@ -42,10 +42,11 @@ int Mesh::loadObj(const char *buffer, size_t buffer_size) { int offset = 0; size_t bpos = 0; #ifdef _WIN32 - while (sscanf_s(cpos, "%s %n", word, 128, &offset) == 1) { + while (sscanf_s(cpos, "%s %n", word, 128, &offset) == 1) #else - while (sscanf(cpos, "%s %n", word, &offset) == 1) { + while (sscanf(cpos, "%s %n", word, &offset) == 1) #endif + { bpos += offset; cpos += offset; if (strcmp(word, "v") == 0) { // vertices @@ -197,11 +198,26 @@ int Mesh::loadObj(const char *buffer, size_t buffer_size) { int i; int indices = vertex_indices.size(); // TODO: vertex index access should be checked for validity (>= 0 < temp_vertices.size()) + // FIXME: At the moment, we're creating "empty" values if uv_indices or normal_indices are less than vertex indices - this seems very strange. I don't think uvs or normals could ever exceed the vertex count, so it might be okay? for (i = 0; i < indices; i++) { Vec3 vertex = temp_vertices[vertex_indices[i]-1]; vertices.push_back(vertex); + if (uv_indices.size() <= i) { + Vec2 uv(0.0f, 0.0f); + uvs.push_back(uv); + } else { + Vec2 uv = temp_uvs[uv_indices[i]-1]; + uvs.push_back(uv); + } + if (normal_indices.size() <= i) { + Vec3 normal(0.0f, 0.0f, 0.0f); + normals.push_back(normal); + } else { + Vec3 normal = temp_normals[normal_indices[i]-1]; + normals.push_back(normal); + } } - indices = uv_indices.size(); + /*indices = uv_indices.size(); for (i = 0; i < indices; i++) { printf("%d/%d\n", i, indices); printf("%d\n", uv_indices[i]); @@ -212,7 +228,7 @@ int Mesh::loadObj(const char *buffer, size_t buffer_size) { for (i = 0; i < indices; i++) { Vec3 normal = temp_normals[normal_indices[i]-1]; normals.push_back(normal); - } + }*/ flags |= MESH_LOADED; return 0; } diff --git a/src/RenderObject.cpp b/src/RenderObject.cpp index 8740a3c..b840632 100644 --- a/src/RenderObject.cpp +++ b/src/RenderObject.cpp @@ -9,6 +9,7 @@ This header file defines the RenderObject class. /* ======== Constructors and Destructors ======== */ RenderObject::RenderObject() { mesh = NULL; + texture = NULL; translation = Mat4( Vec4(1.0, 0.0, 0.0, 0.0), Vec4(0.0, 1.0, 0.0, 0.0), @@ -23,6 +24,9 @@ RenderObject::~RenderObject() { void RenderObject::setMesh(Mesh *new_mesh) { mesh = new_mesh; } +void RenderObject::setTexture(Texture *new_texture) { + texture = new_texture; +} void RenderObject::setTranslation(float x, float y, float z) { translation[3][0] = x; translation[3][1] = y; @@ -39,4 +43,4 @@ void RenderObject::setScale(float x, float y, float z) { } void RenderObject::calcMatrix() { model = translation * rotation * scale; -} \ No newline at end of file +} diff --git a/src/RenderObject.hpp b/src/RenderObject.hpp index f355231..3940d21 100644 --- a/src/RenderObject.hpp +++ b/src/RenderObject.hpp @@ -11,6 +11,7 @@ a Mesh, a texture, a position, and an orientation. #define RENDEROBJECT_HPP #include "common.hpp" #include "Mesh.hpp" +#include "Texture.hpp" #include "Mat4.hpp" class RenderObject { friend class RenderSet; @@ -23,12 +24,13 @@ class RenderObject { void setRotation(float pitch, float roll, float yaw); void setScale(float x, float y, float z); void setMesh(Mesh *new_mesh); + void setTexture(Texture *new_texture); private: Mesh *mesh; - // GLuint texture; + Texture *texture; Mat4 translation; Mat4 rotation; Mat4 scale; Mat4 model; }; -#endif \ No newline at end of file +#endif diff --git a/src/RenderScene.cpp b/src/RenderScene.cpp index d3c26e7..08e6aa1 100644 --- a/src/RenderScene.cpp +++ b/src/RenderScene.cpp @@ -79,6 +79,7 @@ int RenderScene::doRender() { // FIXME: We are temporarily getting the locations here - this needs to be moved elsewhere (Program?) GLuint shader_projection = glGetUniformLocation(glsl_program, "proj_matrix"); GLuint shader_modelview = glGetUniformLocation(glsl_program, "mv_matrix"); + GLuint shader_texture = glGetUniformLocation(glsl_program, "texture_sampler"); GLuint shader_vp = glGetAttribLocation(glsl_program, "vp"); GLuint shader_uv = glGetAttribLocation(glsl_program, "uv"); GLuint shader_normal = glGetAttribLocation(glsl_program, "normal"); @@ -87,8 +88,8 @@ int RenderScene::doRender() { glUniformMatrix4fv(shader_projection, 1, GL_FALSE, camera->p_matrix.toFloats(pm)); // enable attribs glEnableVertexAttribArray(shader_vp); - //glEnableVertexAttribArray(shader_uv); - //glEnableVertexAttribArray(shader_normal); + glEnableVertexAttribArray(shader_uv); + glEnableVertexAttribArray(shader_normal); // Iterate over the set's render objects std::vector::iterator obj_it, obj_end; for (obj_it = set->objects.begin(), obj_end = set->objects.end(); obj_it != obj_end; ++obj_it) { @@ -96,7 +97,17 @@ int RenderScene::doRender() { Mat4 mv_matrix; // modelview matrix float mv[16]; // converted modelview to send to OpenGL Mesh *mesh; + Texture *texture; + GLuint gl_texture = 0; if ((mesh = object->mesh) == NULL) continue; // No mesh to render with, bail + if ((texture = object->texture) == NULL) { + // TODO: add a "missing texture" texture here + } else { + gl_texture = object->texture->texture; + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, gl_texture); + glUniform1i(shader_texture, 0); + } // TODO: if object is not in camera's view, continue (probably reverse projection on each screen corner) // send computed modelview to shader mv_matrix = camera->mv_matrix * object->model; @@ -111,6 +122,8 @@ int RenderScene::doRender() { // bind normals glBindBuffer(GL_ARRAY_BUFFER, mesh->nbo); glVertexAttribPointer(shader_normal, 3, GL_FLOAT, GL_FALSE, 0, NULL); + //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->ibo); + //glDrawElements(GL_TRIANGLES, mesh->indices.size(), GL_UNSIGNED_INT, 0); glDrawArrays(GL_TRIANGLES, 0, mesh->vertices.size()); // TODO: maybe other things? Should this be managed by Program somehow? } diff --git a/src/Texture.cpp b/src/Texture.cpp new file mode 100644 index 0000000..3eb4b9f --- /dev/null +++ b/src/Texture.cpp @@ -0,0 +1,90 @@ +#include "Texture.hpp" +#include "Log.hpp" +#include "SDL_image.h" + +/* ======== Constructors/Destructor ======== */ +Texture::Texture(std::string name_, const char *buffer, size_t buffer_size) { + name.assign(name_); + texture = 0; + flags = 0; + w = h = 0; + image = NULL; + loadImg(buffer, buffer_size); +} +Texture::~Texture() { + destroyTexture(); +} +/* ======== Image/Surface loading/unloading ======== */ +/* loadImg +This function takes in the given buffer that is composed of an SDL2_image compatible format, copies it to an SDL_RWops, loads it is an SDL_Surface, and then generates an OpenGL texture. + +Yes, this is wasteful. +*/ +int Texture::loadImg(const char *buffer, size_t buffer_size) { + if (flags & LOADED) { + LOG(LOG_WARNING) << FUNC_NAME << ": surface already loaded - unloading and replacing"; + unloadImg(); + } + if ((image = IMG_Load_RW(SDL_RWFromMem((char*)buffer, buffer_size), 1)) == NULL) { + LOG(LOG_ERROR) << FUNC_NAME << ": Could not load image from buffer: " << IMG_GetError(); + return 1; + } + flags |= LOADED; + w = image->w; + h = image->h; + return 0; +} +/* unloadImg +This function effectively frees the SDL_Surface allocated by loadImg. It should be called after buildTexture() +*/ +int Texture::unloadImg() { + if (flags & LOADED) { + SDL_FreeSurface(image); + flags &= ~LOADED; + return 0; + } + return 1; +} +/* ======== Texture generation/destruction ======== */ +/* buildTexture +This function generates the OpenGL texture is an image is loaded. If the texture is already built, it is destroyed and recreated. + +Returns 0 if no image is loaded, otherwise it returns the texture ID. +*/ +GLuint Texture::buildTexture() { + if (!(flags & LOADED)) { + LOG(LOG_WARNING) << FUNC_NAME << ": image is not loaded!"; + return 0; + } + if (flags & BUILT) { + LOG(LOG_WARNING) << FUNC_NAME << ": texture already built, destroying and recreating"; + destroyTexture(); + } + // Unbind any previous texture + glBindTexture(GL_TEXTURE_2D, 0); + // Create the texture + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + if (glIsTexture(texture) != 1) { + LOG(LOG_WARNING) << FUNC_NAME << ": failed to generate texture!"; + return 0; + } + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glBindTexture(GL_TEXTURE_2D, 0); + flags |= BUILT; + LOG(LOG_DEBUG) << FUNC_NAME << ": " << name << " built as " << texture; + return texture; +} +/* destroyTexture +Deletes the given texture from OpenGL if it was already built via buildTexture. +*/ +int Texture::destroyTexture() { + if (flags & BUILT) { + glDeleteTextures(1, &texture); + flags &= ~BUILT; + return 0; + } + return 1; +} diff --git a/src/Texture.hpp b/src/Texture.hpp new file mode 100644 index 0000000..0b5ff75 --- /dev/null +++ b/src/Texture.hpp @@ -0,0 +1,30 @@ +/* ================================================================ +Texture +---------------- +Texture.cpp/Texture.hpp provide the Texture class. This class is most akin to the Mesh object. +================================================================ */ +#ifndef TEXTURE_HPP +#define TEXTURE_HPP +#include "common.hpp" +#include +class Texture { + public: + Texture(std::string name_, const char *buffer, size_t buffer_size); + ~Texture(); + enum Flags { + LOADED = (1 << 1), + BUILT = (1 << 2) + }; + int loadImg(const char *buffer, size_t buffer_size); + int unloadImg(); + GLuint buildTexture(); + int destroyTexture(); + GLuint texture; // + private: + std::string name; + unsigned int flags; // status flags + SDL_Surface *image; // the SDL_Surface that contains the data for the texture - this is populated on loadImg and should be destroyed by unloadImg whenever is convenient (usually after buildTexture) + int w, h; // width and height of this image +}; + +#endif diff --git a/src/main.cpp b/src/main.cpp index 9a1d5b4..e58fbee 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -58,7 +58,9 @@ int main(int argc, char *argv[]) { core.doProcess(); SDL_Delay(1); } + #ifndef __ANDROID__ core.closeSystem(); + #endif #endif return 0; } diff --git a/src/states/TestState.cpp b/src/states/TestState.cpp index 57b27d9..0cb1e85 100644 --- a/src/states/TestState.cpp +++ b/src/states/TestState.cpp @@ -6,6 +6,7 @@ #include "RenderObject.hpp" #include "Program.hpp" #include "Mesh.hpp" +#include "Texture.hpp" /* ======== Construction and Destruction ======== */ TestState::TestState() { scene = NULL; @@ -189,13 +190,19 @@ int TestState::onInit() { sert->setProgram(program_model); Asset *asset_mesh; + Asset *asset_texture; RenderObject *objerct = new RenderObject(); asset_mesh = asset_manager->loadFile("models/cube.obj"); Mesh *mersh = new Mesh(asset_mesh->getData(), asset_mesh->getDataLength()); + asset_texture = asset_manager->loadFile("textures/cube.png"); + Texture *texture = new Texture("textures/cube.png", asset_texture->getData(), asset_texture->getDataLength()); + texture->buildTexture(); + asset_texture->unloadData(); asset_mesh->unloadData(); mersh->buildMesh(); objerct->setMesh(mersh); + objerct->setTexture(texture); sert->addObject(objerct); objerct = new RenderObject();