From 03b8658666dad27fc2607c8deb73d0ec2a8cbeef Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 5 Jun 2026 21:43:30 +0900 Subject: [PATCH] wip --- engine/include/fishbone/base.h | 17 +++++++ engine/include/fishbone/client.h | 9 ++-- engine/include/fishbone/draw.h | 24 ++++++--- engine/include/fishbone/foundation.h | 3 ++ engine/include/fishbone/log.h | 35 +++++++++++++ engine/include/fishbone/meshldr.h | 23 +++++++++ engine/include/fishbone/resource.h | 4 +- engine/include/fishbone/sound.h | 14 +++-- engine/include/fishbone/time.h | 2 +- engine/include/fishbone/types.h | 2 +- engine/include/fishbone/window.h | 1 + engine/src/client.cc | 27 +++++++--- engine/src/draw/opengl.cc | 38 +++++--------- engine/src/file.cc | 2 +- engine/src/log.cc | 25 +++++++++ engine/src/meshldr.cc | 76 ++++++++++++++++++++++++++++ engine/src/time.cc | 2 +- engine/src/window/sdl2.cc | 8 ++- 18 files changed, 256 insertions(+), 56 deletions(-) create mode 100644 engine/include/fishbone/base.h create mode 100644 engine/include/fishbone/log.h create mode 100644 engine/include/fishbone/meshldr.h create mode 100644 engine/src/log.cc create mode 100644 engine/src/meshldr.cc diff --git a/engine/include/fishbone/base.h b/engine/include/fishbone/base.h new file mode 100644 index 0000000..9268b24 --- /dev/null +++ b/engine/include/fishbone/base.h @@ -0,0 +1,17 @@ +#ifndef __FISHBONE_BASE_H__ +#define __FISHBONE_BASE_H__ + +#include + +namespace fishbone { + class Base; +}; + +#include + +namespace fishbone { + class Base : public fishbone::Logger { + }; +}; // namespace fishbone + +#endif diff --git a/engine/include/fishbone/client.h b/engine/include/fishbone/client.h index e29a7cb..4777589 100644 --- a/engine/include/fishbone/client.h +++ b/engine/include/fishbone/client.h @@ -11,19 +11,20 @@ namespace fishbone { #include #include #include +#include namespace fishbone { - class Client { + class Client : public fishbone::Base { public: Client(std::unordered_map> param); ~Client(); bool step(); - + fishbone::Window* window; fishbone::SoundDriver* sounddrv; - fishbone::Mixer* mixer; - fishbone::Renderer* renderer; + fishbone::Mixer* mixer; + fishbone::Renderer* renderer; }; }; // namespace fishbone diff --git a/engine/include/fishbone/draw.h b/engine/include/fishbone/draw.h index a786e94..3855f0e 100644 --- a/engine/include/fishbone/draw.h +++ b/engine/include/fishbone/draw.h @@ -7,26 +7,34 @@ namespace fishbone { class Texture; class Mesh; class Renderer; -}; +}; // namespace fishbone -/* no includes */ +#include +#include namespace fishbone { class Texture { struct Impl; Impl* impl; - public: + public: Texture(fishbone::Renderer* renderer, unsigned char* rgba, int width, int height); ~Texture(); }; class Mesh { + void init(fishbone::Renderer* renderer, std::vector vertices, std::vector texcoords, std::vector normals); + struct Impl; Impl* impl; - public: - Mesh(fishbone::Renderer* renderer, std::vector vertices, std::vector texcoords, std::vector normals, std::vector elements); + public: + Mesh(fishbone::Renderer* renderer, std::vector vertices, std::vector texcoords, std::vector normals) { + this->init(renderer, vertices, texcoords, normals); + } + Mesh(fishbone::Renderer* renderer, fishbone::MeshData* data) { + this->init(renderer, data->vertices, data->texcoords, data->normals); + } ~Mesh(); void draw(); @@ -36,10 +44,10 @@ namespace fishbone { struct Impl; Impl* impl; - public: - Renderer(); + public: + Renderer(fishbone::Window* window); ~Renderer(); }; -}; +}; // namespace fishbone #endif diff --git a/engine/include/fishbone/foundation.h b/engine/include/fishbone/foundation.h index 85f859e..dfb58fe 100644 --- a/engine/include/fishbone/foundation.h +++ b/engine/include/fishbone/foundation.h @@ -10,5 +10,8 @@ #include #include #include +#include +#include +#include #endif diff --git a/engine/include/fishbone/log.h b/engine/include/fishbone/log.h new file mode 100644 index 0000000..83a0978 --- /dev/null +++ b/engine/include/fishbone/log.h @@ -0,0 +1,35 @@ +#ifndef __FISHBONE_LOG_H__ +#define __FISHBONE_LOG_H__ + +#include + +namespace fishbone { + class Logger; +}; + +/* no includes */ + +namespace fishbone { + class Logger { + enum LoggerLevel { + Log = 0, + Info, + Warn, + Error + }; + + void init(std::string path); + + std::ofstream ofs; + + public: + Logger(); + Logger(std::string path); + ~Logger(); + + void log(std::string arg); + void log(int level, std::string arg); + }; +}; // namespace fishbone + +#endif diff --git a/engine/include/fishbone/meshldr.h b/engine/include/fishbone/meshldr.h new file mode 100644 index 0000000..f38b49f --- /dev/null +++ b/engine/include/fishbone/meshldr.h @@ -0,0 +1,23 @@ +#ifndef __FISHBONE_MESHLDR_H__ +#define __FISHBONE_MESHLDR_H__ + +#include + +namespace fishbone { + class MeshData; +}; + +#include + +namespace fishbone { + class MeshData { + public: + MeshData(fishbone::File* file); + + std::vector vertices; + std::vector texcoords; + std::vector normals; + }; +}; // namespace fishbone + +#endif diff --git a/engine/include/fishbone/resource.h b/engine/include/fishbone/resource.h index a995f15..8efa342 100644 --- a/engine/include/fishbone/resource.h +++ b/engine/include/fishbone/resource.h @@ -12,10 +12,10 @@ namespace fishbone { namespace fishbone { class Resource { public: - fishbone::File* open(std::string path); - Resource(std::string path); ~Resource(); + + fishbone::File* open(std::string path); }; }; // namespace fishbone diff --git a/engine/include/fishbone/sound.h b/engine/include/fishbone/sound.h index 1277ec5..4ee2f0d 100644 --- a/engine/include/fishbone/sound.h +++ b/engine/include/fishbone/sound.h @@ -55,12 +55,16 @@ namespace fishbone { class SoundLoader { public: - SoundLoader(){}; - ~SoundLoader(){}; + SoundLoader() {}; + ~SoundLoader() {}; - virtual Sound* open(Mixer* mixer, void* buffer, size_t size){return nullptr;}; - virtual int read(Sound* sound, short* buffer, size_t frames){return 0;}; - virtual void seek(Sound* sound, size_t pos){}; + virtual Sound* open(Mixer* mixer, void* buffer, size_t size) { + return nullptr; + }; + virtual int read(Sound* sound, short* buffer, size_t frames) { + return 0; + }; + virtual void seek(Sound* sound, size_t pos) {}; }; class Sound { diff --git a/engine/include/fishbone/time.h b/engine/include/fishbone/time.h index cd7e6a9..34ed080 100644 --- a/engine/include/fishbone/time.h +++ b/engine/include/fishbone/time.h @@ -7,7 +7,7 @@ namespace fishbone { using AccurateClock = std::chrono::time_point; fishbone::AccurateClock accurateTime(); -}; +}; // namespace fishbone /* no includes */ diff --git a/engine/include/fishbone/types.h b/engine/include/fishbone/types.h index 9d01009..184b9c6 100644 --- a/engine/include/fishbone/types.h +++ b/engine/include/fishbone/types.h @@ -14,6 +14,6 @@ namespace fishbone { float y; float z; }; -}; +}; // namespace fishbone #endif diff --git a/engine/include/fishbone/window.h b/engine/include/fishbone/window.h index 0846a75..9a9abac 100644 --- a/engine/include/fishbone/window.h +++ b/engine/include/fishbone/window.h @@ -17,6 +17,7 @@ namespace fishbone { ~Window(); void poll(); + void swapBuffer(); }; }; // namespace fishbone diff --git a/engine/src/client.cc b/engine/src/client.cc index bc17717..9482306 100644 --- a/engine/src/client.cc +++ b/engine/src/client.cc @@ -1,18 +1,33 @@ #include -fishbone::Client::Client(std::unordered_map> param){ - this->window = new fishbone::Window("Fishbone", 800, 600); +fishbone::File* f; +fishbone::MeshData* md; +fishbone::Mesh* m; + +fishbone::Client::Client(std::unordered_map> param) { + this->window = new fishbone::Window("Fishbone", 800, 600); this->sounddrv = new fishbone::SoundDriver(); - this->mixer = &this->sounddrv->mixer; - this->renderer = new fishbone::Renderer(); + this->mixer = &this->sounddrv->mixer; + this->renderer = new fishbone::Renderer(this->window); + + f = new fishbone::File("model.obj", "r"); + md = new fishbone::MeshData(f); + delete f; + + m = new fishbone::Mesh(this->renderer, md); + delete md; } -fishbone::Client::~Client(){ +fishbone::Client::~Client() { delete this->renderer; delete this->sounddrv; delete this->window; } -bool fishbone::Client::step(){ +bool fishbone::Client::step() { + m->draw(); + + this->window->swapBuffer(); + return true; } diff --git a/engine/src/draw/opengl.cc b/engine/src/draw/opengl.cc index 0a0c187..1a47622 100644 --- a/engine/src/draw/opengl.cc +++ b/engine/src/draw/opengl.cc @@ -4,9 +4,9 @@ struct fishbone::Texture::Impl { GLuint texture; }; -fishbone::Texture::Texture(fishbone::Renderer* renderer, unsigned char* rgba, int width, int height){ +fishbone::Texture::Texture(fishbone::Renderer* renderer, unsigned char* rgba, int width, int height) { this->impl = new struct fishbone::Texture::Impl(); - + glGenTextures(1, &this->impl->texture); glBindTexture(GL_TEXTURE_2D, this->impl->texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba); @@ -15,7 +15,7 @@ fishbone::Texture::Texture(fishbone::Renderer* renderer, unsigned char* rgba, in glBindTexture(GL_TEXTURE_2D, 0); } -fishbone::Texture::~Texture(){ +fishbone::Texture::~Texture() { glDeleteTextures(1, &this->impl->texture); delete this->impl; @@ -25,28 +25,24 @@ struct fishbone::Mesh::Impl { GLuint v_vbo; GLuint t_vbo; GLuint n_vbo; - GLuint e_vbo; float* vertices; float* texcoords; float* normals; - int* elements; int count; }; -fishbone::Mesh::Mesh(fishbone::Renderer* renderer, std::vector vertices, std::vector texcoords, std::vector normals, std::vector elements){ - this->impl = new struct fishbone::Mesh::Impl(); - this->impl->vertices = new float[vertices.size() * 3]; +void fishbone::Mesh::init(fishbone::Renderer* renderer, std::vector vertices, std::vector texcoords, std::vector normals) { + this->impl = new struct fishbone::Mesh::Impl(); + this->impl->vertices = new float[vertices.size() * 3]; this->impl->texcoords = new float[texcoords.size() * 2]; - this->impl->normals = new float[normals.size() * 3]; - this->impl->elements = new int[elements.size()]; - this->impl->count = elements.size(); + this->impl->normals = new float[normals.size() * 3]; + this->impl->count = vertices.size(); glGenBuffers(1, &this->impl->v_vbo); glGenBuffers(1, &this->impl->t_vbo); glGenBuffers(1, &this->impl->n_vbo); - glGenBuffers(1, &this->impl->e_vbo); glBindBuffer(GL_ARRAY_BUFFER, this->impl->v_vbo); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float) * 3, this->impl->vertices, GL_STATIC_DRAW); @@ -58,27 +54,20 @@ fishbone::Mesh::Mesh(fishbone::Renderer* renderer, std::vectorimpl->normals, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->impl->e_vbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, elements.size() * sizeof(int), this->impl->elements, GL_STATIC_DRAW); - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -fishbone::Mesh::~Mesh(){ - glDeleteBuffers(1, &this->impl->e_vbo); +fishbone::Mesh::~Mesh() { glDeleteBuffers(1, &this->impl->n_vbo); glDeleteBuffers(1, &this->impl->t_vbo); glDeleteBuffers(1, &this->impl->v_vbo); - delete[] this->impl->elements; delete[] this->impl->normals; delete[] this->impl->texcoords; delete[] this->impl->vertices; delete this->impl; } -void fishbone::Mesh::draw(){ +void fishbone::Mesh::draw() { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); @@ -92,9 +81,8 @@ void fishbone::Mesh::draw(){ glBindBuffer(GL_ARRAY_BUFFER, this->impl->n_vbo); glNormalPointer(GL_FLOAT, 0, nullptr); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->impl->e_vbo); glEnable(GL_TEXTURE_2D); - glDrawElements(GL_TRIANGLES, this->impl->count, GL_UNSIGNED_INT, nullptr); + glDrawArrays(GL_TRIANGLES, 0, this->impl->count); glDisable(GL_TEXTURE_2D); glDisableClientState(GL_NORMAL_ARRAY); @@ -102,8 +90,8 @@ void fishbone::Mesh::draw(){ glDisableClientState(GL_VERTEX_ARRAY); } -fishbone::Renderer::Renderer(){ +fishbone::Renderer::Renderer(fishbone::Window* window) { } -fishbone::Renderer::~Renderer(){ +fishbone::Renderer::~Renderer() { } diff --git a/engine/src/file.cc b/engine/src/file.cc index fce8a35..9cd8301 100644 --- a/engine/src/file.cc +++ b/engine/src/file.cc @@ -1,6 +1,6 @@ #include -fishbone::File::File(){ +fishbone::File::File() { this->good = true; this->size = 0; } diff --git a/engine/src/log.cc b/engine/src/log.cc new file mode 100644 index 0000000..433e1ad --- /dev/null +++ b/engine/src/log.cc @@ -0,0 +1,25 @@ +#include + +void fishbone::Logger::init(std::string path) { + this->ofs = std::ofstream(path, std::ios_base::app); +} + +fishbone::Logger::Logger() { + this->init("log.txt"); +} + +fishbone::Logger::Logger(std::string path) { + this->init(path); +} + +fishbone::Logger::~Logger() { + this->ofs.close(); +} + +void fishbone::Logger::log(std::string arg) { + this->log(fishbone::Logger::Info, arg); +} + +void fishbone::Logger::log(int level, std::string arg) { + this->ofs << "" + arg << std::endl; +} diff --git a/engine/src/meshldr.cc b/engine/src/meshldr.cc new file mode 100644 index 0000000..4391fb5 --- /dev/null +++ b/engine/src/meshldr.cc @@ -0,0 +1,76 @@ +#include + +#include + +static std::vector parseFace(std::string s) { + std::vector v; + std::string n = ""; + + for(int i = 0; i < s.size(); i++) { + if(s[i] == '/') { + v.push_back(std::stoi(n)); + n = ""; + } else { + n += s[i]; + } + } + if(n.size() > 0) v.push_back(std::stoi(n)); + + return v; +} + +fishbone::MeshData::MeshData(fishbone::File* f) { + char c; + std::string l = ""; + std::vector v; + std::vector vt; + std::vector vn; + fishbone::Vector2 e2 = {0, 0}; + fishbone::Vector3 e3 = {0, 0, 0}; + + while(f->read(&c, 1) == 1) { + if(c == '\n') { + if(l.size() == 0) { + } else if(l[0] == '#') { + } else { + std::vector vs; + std::string n = ""; + + for(int i = 0; i < l.size(); i++) { + if(l[i] == ' ') { + vs.push_back(n); + n = ""; + } else { + n += l[i]; + } + } + if(n.size() > 0) vs.push_back(n); + + if(vs[0] == "v") { + fishbone::Vector3 nv = {std::stof(vs[1]), std::stof(vs[2]), std::stof(vs[3])}; + + v.push_back(nv); + } else if(vs[0] == "vt") { + fishbone::Vector2 nv = {std::stof(vs[1]), std::stof(vs[2])}; + + vt.push_back(nv); + } else if(vs[0] == "vn") { + fishbone::Vector3 nv = {std::stof(vs[1]), std::stof(vs[2]), std::stof(vs[3])}; + + vn.push_back(nv); + } else if(vs[0] == "f") { + for(int i = 1; i < 4; i++) { + std::vector ind = parseFace(vs[i]); + + this->vertices.push_back(v[ind[0]]); + this->texcoords.push_back(ind.size() >= 2 ? vt[ind[1]] : e2); + this->normals.push_back(ind.size() >= 3 ? vn[ind[2]] : e3); + } + } + } + l = ""; + } else if(c != '\r') { + l += c; + } + } +} diff --git a/engine/src/time.cc b/engine/src/time.cc index fdf52c4..1046608 100644 --- a/engine/src/time.cc +++ b/engine/src/time.cc @@ -1,5 +1,5 @@ #include -fishbone::AccurateClock fishbone::accurateTime(){ +fishbone::AccurateClock fishbone::accurateTime() { return std::chrono::high_resolution_clock::now(); } diff --git a/engine/src/window/sdl2.cc b/engine/src/window/sdl2.cc index 9264184..e14965e 100644 --- a/engine/src/window/sdl2.cc +++ b/engine/src/window/sdl2.cc @@ -28,10 +28,14 @@ fishbone::Window::~Window() { delete this->impl; } -void fishbone::Window::poll(){ +void fishbone::Window::poll() { SDL_Event ev; - while(SDL_PollEvent(&ev)){ + while(SDL_PollEvent(&ev)) { } } + +void fishbone::Window::swapBuffer() { + SDL_GL_SwapWindow(this->impl->window); +} #endif