Skip to content
Open
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)
Comment thread
Lunanne marked this conversation as 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)
197 changes: 157 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 <iostream>
#include <GL/glu.h>
Comment thread
Lunanne marked this conversation as resolved.
#include <graphics/imPipeline.h>
Comment thread
Lunanne marked this conversation as resolved.
Outdated
#include "imCommon.h"
#include "scene/imSceneDatabase.h"
#include "scene/imSceneIndex.h"
Expand All @@ -29,23 +32,116 @@
# 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_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
Comment thread
Lunanne marked this conversation as resolved.
Outdated
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 +206,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 +243,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.",
Comment thread
Lunanne marked this conversation as resolved.
Outdated
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);
Comment thread
Lunanne marked this conversation as 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