Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to OpenGL4 #6

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
6 changes: 6 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
root = true

[*]
indent_type = space
indent_size = 4
max_line_length = off
13 changes: 10 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,9 @@

cmake_minimum_required(VERSION 3.0)
project(imaginaryMyst LANGUAGES CXX)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
include(FeatureSummary)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

option(ENABLE_SSE2 "Build with SSE2 SIMD instructions" ON)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
Expand Down Expand Up @@ -65,11 +63,20 @@ set_package_properties(string_theory PROPERTIES
)
include_directories(${STRING_THEORY_INCLUDE_DIRS})

find_package(GLEW REQUIRED)
Lunanne marked this conversation as resolved.
Show resolved Hide resolved
set_package_properties(GLM PROPERTIES
URL "https://github.com/nigels-com/glew"
DESCRIPTION "The OpenGL Extension Wrangler Library"
TYPE REQUIRED
)

feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
include_directories(${GLEW_INCLUDE_DIR})
include_directories(${OPENGL_INCLUDE_DIR})
include_directories(${GLM_INCLUDE_DIRS})
include_directories(${ZLIB_INCLUDE_DIR})
include_directories(${GLM_INCLUDE_DIRS})


# 3rd party Squish library for DXT codecs
include_directories(libsquish)
Expand Down
2 changes: 1 addition & 1 deletion libsquish/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ LIB = libsquish.a
all : $(LIB)

install : $(LIB)
install squish.h $(INSTALL_DIR)/include
install squish.h $(INSTALL_DIR)/include
install libsquish.a $(INSTALL_DIR)/lib

uninstall:
Expand Down
3 changes: 3 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@ set(imCommon_HEADERS
imKeyList.h
imRef.h
imThread.h
graphics/imPipeline.h
)

set(imCommon_SOURCES
imGeometry3.cpp
imKeyList.cpp
Main.cpp
graphics/imPipeline.cpp
)

source_group("Header Files" FILES ${imCommon_HEADERS})
Expand All @@ -44,5 +46,6 @@ target_link_libraries(imaginaryMyst squish SDL2::SDL2 SDL2::SDL2main)
target_link_libraries(imaginaryMyst ${OPENGL_LIBRARIES})
target_link_libraries(imaginaryMyst ${ZLIB_LIBRARIES})
target_link_libraries(imaginaryMyst ${STRING_THEORY_LIBRARIES})
target_link_libraries(imaginaryMyst ${GLEW_LIBRARY})

install(TARGETS imaginaryMyst RUNTIME DESTINATION bin)
199 changes: 159 additions & 40 deletions src/Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
* along with imaginaryMyst. If not, see <http://www.gnu.org/licenses/>.
*/

#include <GL/glew.h>
#include <GL/glu.h>
Lunanne marked this conversation as resolved.
Show resolved Hide resolved
#include <iostream>
#include "graphics/imPipeline.h"
#include "imCommon.h"
#include "scene/imSceneDatabase.h"
#include "scene/imSceneIndex.h"
Expand All @@ -29,23 +32,118 @@
# include <direct.h>
#endif

static void openglCallbackFunction(GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length, const GLchar *message,
const void *userParam)
{
std::cout << "---------------" << std::endl;
std::cout << "Debug message (" << id << "): " << message << std::endl;

switch (source) {
case GL_DEBUG_SOURCE_API:
std::cout << "Source: API";
break;
case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
std::cout << "Source: Window System";
break;
case GL_DEBUG_SOURCE_SHADER_COMPILER:
std::cout << "Source: Shader Compiler";
break;
case GL_DEBUG_SOURCE_THIRD_PARTY:
std::cout << "Source: Third Party";
break;
case GL_DEBUG_SOURCE_APPLICATION:
std::cout << "Source: Application";
break;
case GL_DEBUG_SOURCE_OTHER:
std::cout << "Source: Other";
break;
}
std::cout << std::endl;

switch (type) {
case GL_DEBUG_TYPE_ERROR:
std::cout << "Type: Error";
break;
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
std::cout << "Type: Deprecated Behaviour";
break;
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
std::cout << "Type: Undefined Behaviour";
break;
case GL_DEBUG_TYPE_PORTABILITY:
std::cout << "Type: Portability";
break;
case GL_DEBUG_TYPE_PERFORMANCE:
std::cout << "Type: Performance";
break;
case GL_DEBUG_TYPE_MARKER:
std::cout << "Type: Marker";
break;
case GL_DEBUG_TYPE_PUSH_GROUP:
std::cout << "Type: Push Group";
break;
case GL_DEBUG_TYPE_POP_GROUP:
std::cout << "Type: Pop Group";
break;
case GL_DEBUG_TYPE_OTHER:
std::cout << "Type: Other";
break;
}
std::cout << std::endl;

switch (severity) {
case GL_DEBUG_SEVERITY_HIGH:
std::cout << "Severity: high";
break;
case GL_DEBUG_SEVERITY_MEDIUM:
std::cout << "Severity: medium";
break;
case GL_DEBUG_SEVERITY_LOW:
std::cout << "Severity: low";
break;
case GL_DEBUG_SEVERITY_NOTIFICATION:
std::cout << "Severity: notification";
break;
}
std::cout << std::endl;
std::cout << std::endl;
}

ST::string s_rootPath;

imVfs s_vfs;
SDL_Window *s_display;

SDL_GLContext s_glContext;
FILE *s_logFile = stderr;

PFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLX_CompressedTexImage2D = 0;

static void cleanup()
{
SDL_GL_DeleteContext(s_glContext);
SDL_DestroyWindow(s_display);

SDL_Quit();
}

#ifdef WIN32
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
#else

int main(int argc, char *argv[])
#endif
{
/* Initialize SDL */
SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
// SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
// SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
// SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(
SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG
);

#ifdef WIN32
s_logFile = fopen("imaginaryMyst.log", "wb");
Expand Down Expand Up @@ -110,9 +208,12 @@ int main(int argc, char *argv[])
}
s_vfs.addDniFile(s_rootPath + "/pera.dni");

s_vfs.debug_print();

// Add the game dir last, so duplicates use the physical copy
s_vfs.addPhysicalPath(s_rootPath);


imLog("Reading Scene Database...");
imSceneDatabase sdb;
imStream *stream = s_vfs.open("/scn/myst.idx");
Expand Down Expand Up @@ -144,69 +245,87 @@ int main(int argc, char *argv[])
delete stream;
}


// Create a window for the game

s_display = SDL_CreateWindow("imaginaryMyst Alpha",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
winWidth, winHeight,
SDL_WINDOW_OPENGL);
SDL_GLContext glContext = SDL_GL_CreateContext(s_display);
glm::mat4 projection = glm::perspective(
45.0f, // FoV
(float)winWidth / (float)winHeight, // Aspect Ratio
0.1f, // Near Plane
10000.0f); // Far Plane
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
winWidth, winHeight,
SDL_WINDOW_OPENGL);
s_glContext = SDL_GL_CreateContext(s_display);
glewExperimental = true;
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);

GLX_CompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)
SDL_GL_GetProcAddress("glCompressedTexImage2DARB");
if (GLX_CompressedTexImage2D == 0)
imMipmap::s_noDXTCompression = true;
int glMajorVersion;
int glMinorVersion;
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &glMajorVersion);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &glMinorVersion);

if (glMajorVersion < 3) {
fprintf(stderr,
"ERROR OpenGL version too low, only OpenGL 3 or higher are supported. Opengl version detected %d.%d.\n",
glMajorVersion, glMinorVersion);
cleanup();
return 1;
}
if (glMajorVersion > 4 || (glMajorVersion == 4 && glMinorVersion >= 3)) {
glDebugMessageCallback(static_cast<GLDEBUGPROC>(openglCallbackFunction), nullptr);
glDebugMessageControl(
GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, true
);
}

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glewExperimental = true;
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(openglCallbackFunction, nullptr);
Lunanne marked this conversation as resolved.
Show resolved Hide resolved
glDebugMessageControl(
GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, true
);

glShadeModel(GL_SMOOTH);
glClearDepth(1.0f);
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glViewport(0, 0, winWidth, winHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glLoadMatrixf(glm::value_ptr(projection));
glEnable(GL_TEXTURE_2D);
glDisable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

GLX_CompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)
SDL_GL_GetProcAddress("glCompressedTexImage2DARB");
if (GLX_CompressedTexImage2D == 0)
imMipmap::s_noDXTCompression = true;

imLog("DEBUG: Reading CreditsScene03Top.hsm...");
imMipmap img;
stream = s_vfs.open("/scn/maps/CreditsScene03Top.hsm");
if (stream != 0) {
img.read(stream);
delete stream;
img.prepare();
} else {
imLog("Error reading HSM file");
}
img.TEST_ExportDDS("test1.dds");
imPipeline pipeline;
img.prepare();
pipeline.initialize();

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0f, 0.0f, -4.0f);
img.bind();
pipeline.render();

glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

SDL_GL_SwapWindow(s_display);
SDL_Delay(3000);
SDL_GL_DeleteContext(glContext);
SDL_DestroyWindow(s_display);

SDL_Quit();
cleanup();
return 0;
}
Loading