Initial commit

This commit is contained in:
erysdren 2024-10-14 11:53:16 -05:00
commit d120cd005a
9 changed files with 259 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
untracked/
cmake-build*/

6
.gitmodules vendored Normal file
View file

@ -0,0 +1,6 @@
[submodule "imgui"]
path = imgui
url = https://git.erysdren.me/mirrors/imgui.git
[submodule "y3d"]
path = y3d
url = https://git.erysdren.me/erysdren/yeti3dpro-sdl3

35
CMakeLists.txt Normal file
View file

@ -0,0 +1,35 @@
cmake_minimum_required(VERSION 3.28)
project(yeti3dpro-editor LANGUAGES C CXX)
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3-shared)
# import y3d
add_subdirectory(${PROJECT_SOURCE_DIR}/y3d)
# import imgui
add_library(imgui STATIC)
target_sources(imgui PRIVATE
${PROJECT_SOURCE_DIR}/imgui/imgui_demo.cpp
${PROJECT_SOURCE_DIR}/imgui/imgui_draw.cpp
${PROJECT_SOURCE_DIR}/imgui/imgui_tables.cpp
${PROJECT_SOURCE_DIR}/imgui/imgui_widgets.cpp
${PROJECT_SOURCE_DIR}/imgui/imgui.cpp
${PROJECT_SOURCE_DIR}/imgui/backends/imgui_impl_sdl3.cpp
${PROJECT_SOURCE_DIR}/imgui/backends/imgui_impl_sdlrenderer3.cpp
)
target_include_directories(imgui PUBLIC
${PROJECT_SOURCE_DIR}/imgui
${PROJECT_SOURCE_DIR}/imgui/backends
)
target_link_libraries(imgui PUBLIC SDL3::SDL3)
# editor
add_executable(yeti3dpro-editor)
target_sources(yeti3dpro-editor PRIVATE
${PROJECT_SOURCE_DIR}/source/main.cpp
${PROJECT_SOURCE_DIR}/source/editor.cpp
)
target_link_libraries(yeti3dpro-editor PRIVATE imgui y3d game)

5
README.md Normal file
View file

@ -0,0 +1,5 @@
# Yeti3D PRO SDL3 Port
| | | |
|--------------------------------|--------------------------------|--------------------------------|
| ![](./screenshots/yeti006.png) | ![](./screenshots/yeti007.png) | ![](./screenshots/yeti008.png) |

1
imgui Submodule

@ -0,0 +1 @@
Subproject commit 349af8766cbb6ea7e56b242b18be8476bebbe977

84
source/editor.cpp Normal file
View file

@ -0,0 +1,84 @@
#include "editor.hpp"
#include "game.h"
static bool show_demo_window = true;
static yeti_t yeti;
static u16 backbuffer[YETI_FRAMEBUFFER_WIDTH * YETI_FRAMEBUFFER_HEIGHT];
static SDL_Texture *texture = nullptr;
static void editor_yeti_tick(void)
{
const bool *keys = SDL_GetKeyboardState(nullptr);
yeti.keyboard.state.up = keys[SDL_SCANCODE_UP] || keys[SDL_SCANCODE_W];
yeti.keyboard.state.down = keys[SDL_SCANCODE_DOWN] || keys[SDL_SCANCODE_S];
yeti.keyboard.state.left = keys[SDL_SCANCODE_LEFT];
yeti.keyboard.state.right = keys[SDL_SCANCODE_RIGHT];
yeti.keyboard.state.a = keys[SDL_SCANCODE_RCTRL];
yeti.keyboard.state.b = keys[SDL_SCANCODE_SPACE];
yeti.keyboard.state.l = keys[SDL_SCANCODE_A];
yeti.keyboard.state.r = keys[SDL_SCANCODE_Z];
yeti.keyboard.state.select = keys[SDL_SCANCODE_ESCAPE];
game_loop(&yeti);
SDL_UpdateTexture(texture, nullptr, backbuffer, YETI_FRAMEBUFFER_WIDTH * sizeof(u16));
}
void editor_init(void)
{
// create yeti screens
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_XBGR1555, SDL_TEXTUREACCESS_STREAMING, YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT);
if (!texture)
die("Error: SDL_CreateTexture(): %s", SDL_GetError());
// init yeti state
yeti_init(&yeti, backbuffer, backbuffer, textures, palette);
yeti_init_lua(&yeti, YETI_GAMMA);
game_init(&yeti);
}
void editor_main(void)
{
// main menu bar
if (ImGui::BeginMainMenuBar())
{
if (ImGui::BeginMenu("File"))
{
if (ImGui::MenuItem("Quit", "Alt+F4"))
quit(0);
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Misc"))
{
ImGui::MenuItem("Show ImGui Demo", "", &show_demo_window);
ImGui::EndMenu();
}
ImGui::EndMainMenuBar();
}
// demo window for testing
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// game window
ImGui::SetNextWindowContentSize(ImVec2(YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT));
if (ImGui::Begin("Game Window", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse))
{
ImGui::Image((ImTextureID)texture, ImVec2(YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT));
ImGui::End();
}
// tick yeti state
editor_yeti_tick();
}
void editor_quit(void)
{
SDL_DestroyTexture(texture);
}

18
source/editor.hpp Normal file
View file

@ -0,0 +1,18 @@
#ifndef _EDITOR_HPP_
#define _EDITOR_HPP_
#include <SDL3/SDL.h>
#include "imgui.h"
extern SDL_Window *window;
extern SDL_Renderer *renderer;
void quit(int code);
void die(const char *fmt, ...);
void editor_init(void);
void editor_main(void);
void editor_quit(void);
#endif // _EDITOR_HPP_

107
source/main.cpp Normal file
View file

@ -0,0 +1,107 @@
#include "imgui.h"
#include "imgui_impl_sdl3.h"
#include "imgui_impl_sdlrenderer3.h"
#include <cstdlib>
#include <SDL3/SDL.h>
#include "editor.hpp"
SDL_Window *window = nullptr;
SDL_Renderer *renderer = nullptr;
void quit(int code)
{
editor_quit();
ImGui_ImplSDLRenderer3_Shutdown();
ImGui_ImplSDL3_Shutdown();
ImGui::DestroyContext();
if (window) SDL_DestroyRenderer(renderer);
if (renderer) SDL_DestroyWindow(window);
SDL_Quit();
exit(code);
}
void die(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, fmt, ap);
va_end(ap);
quit(1);
}
int main(int argc, char **argv)
{
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD))
die("Error: SDL_Init(): %s", SDL_GetError());
window = SDL_CreateWindow("Yeti3D World Editor", 1280, 720, SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN | SDL_WINDOW_MAXIMIZED);
if (!window)
die("Error: SDL_CreateWindow(): %s", SDL_GetError());
renderer = SDL_CreateRenderer(window, nullptr);
SDL_SetRenderVSync(renderer, 1);
if (!renderer)
die("Error: SDL_CreateRenderer(): %s", SDL_GetError());
SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
SDL_ShowWindow(window);
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO &io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
ImGui::StyleColorsDark();
ImGui_ImplSDL3_InitForSDLRenderer(window, renderer);
ImGui_ImplSDLRenderer3_Init(renderer);
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
editor_init();
while (true)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
ImGui_ImplSDL3_ProcessEvent(&event);
if (event.type == SDL_EVENT_QUIT)
quit(0);
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
quit(0);
}
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
{
SDL_Delay(10);
continue;
}
ImGui_ImplSDLRenderer3_NewFrame();
ImGui_ImplSDL3_NewFrame();
ImGui::NewFrame();
editor_main();
ImGui::Render();
SDL_SetRenderScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
SDL_SetRenderDrawColorFloat(renderer, clear_color.x, clear_color.y, clear_color.z, clear_color.w);
SDL_RenderClear(renderer);
ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer);
SDL_RenderPresent(renderer);
}
quit(0);
return 0;
}

1
y3d Submodule

@ -0,0 +1 @@
Subproject commit 86ba27d73dd67e99b66cd13adb13dd3c3e2c7dd8