Initial commit
This commit is contained in:
commit
d120cd005a
9 changed files with 259 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
untracked/
|
||||||
|
cmake-build*/
|
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal 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
35
CMakeLists.txt
Normal 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
5
README.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Yeti3D PRO SDL3 Port
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
|--------------------------------|--------------------------------|--------------------------------|
|
||||||
|
| ![](./screenshots/yeti006.png) | ![](./screenshots/yeti007.png) | ![](./screenshots/yeti008.png) |
|
1
imgui
Submodule
1
imgui
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 349af8766cbb6ea7e56b242b18be8476bebbe977
|
84
source/editor.cpp
Normal file
84
source/editor.cpp
Normal 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
18
source/editor.hpp
Normal 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
107
source/main.cpp
Normal 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
1
y3d
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 86ba27d73dd67e99b66cd13adb13dd3c3e2c7dd8
|
Loading…
Reference in a new issue