Initial Vectorail Core library

This commit is contained in:
2026-08-02 17:05:27 +02:00
commit d869edfaa8
15 changed files with 749 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
#pragma once
#include <string>
#include <cstdint>
#include <vector>
struct DdsTexture {
unsigned int id = 0;
int width = 0;
int height = 0;
};
// Groove Coaster's stage/menu atlases use uncompressed RGB(A) DDS surfaces.
// This intentionally small loader accepts those surfaces without introducing
// a conversion step or an external image dependency.
bool loadDdsTexture(const std::string& path, DdsTexture& out, std::string* error = nullptr);
bool loadDdsTextureBytes(const std::vector<uint8_t>& bytes, DdsTexture& out,
std::string* error = nullptr);
+15
View File
@@ -0,0 +1,15 @@
#pragma once
#include "vectorail/core/DdsTexture.hpp"
#include <string>
#include <vector>
// The arcade effect atlases have a .bin suffix but contain ordinary PNG
// streams. Keep loading based on the file signature rather than its suffix.
bool loadPngTexture(const std::string& path, DdsTexture& out, std::string* error = nullptr);
// MtxTexture::LoadListData format used by data/skin/skinN/img.dat: a BE
// count/offset table followed by zero or more embedded PNG streams.
bool loadPngTextureList(
const std::string& path, std::vector<DdsTexture>& out, std::string* error = nullptr);
+30
View File
@@ -0,0 +1,30 @@
#pragma once
#include "vectorail/core/gl_loader.hpp"
#include <string>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
class Shader {
public:
unsigned int ID;
Shader(const char* vertexPath, const char* fragmentPath);
void use() const { glUseProgram(ID); }
void setBool(const std::string& name, bool value) const {
glUniform1i(glGetUniformLocation(ID, (const GLchar*)name.c_str()), (int)value);
}
void setInt(const std::string& name, int value) const {
glUniform1i(glGetUniformLocation(ID, (const GLchar*)name.c_str()), value);
}
void setFloat(const std::string& name, float value) const {
glUniform1f(glGetUniformLocation(ID, (const GLchar*)name.c_str()), value);
}
void setVec3(const std::string& name, const glm::vec3& value) const {
glUniform3fv(glGetUniformLocation(ID, (const GLchar*)name.c_str()), 1, &value[0]);
}
void setVec4(const std::string& name, const glm::vec4& value) const {
glUniform4fv(glGetUniformLocation(ID, (const GLchar*)name.c_str()), 1, &value[0]);
}
void setMat4(const std::string& name, const glm::mat4& mat) const {
glUniformMatrix4fv(glGetUniformLocation(ID, (const GLchar*)name.c_str()), 1, GL_FALSE, glm::value_ptr(mat));
}
};
+36
View File
@@ -0,0 +1,36 @@
#pragma once
#include <vector>
#include <glm/glm.hpp>
struct SplinePoint {
glm::vec3 position;
int type; // 0 = Smooth, 1 = Linear
};
class Spline {
public:
Spline() = default;
void addPoint(const glm::vec3& pos, int type = 0);
void clear() { points.clear(); LUT.clear(); totalLength = 0; }
// Получить позицию по физическому расстоянию (метрам) от начала
glm::vec3 getPositionAtDistance(float distance) const;
glm::vec3 getTangentAtDistance(float distance) const;
float getDistanceAtIndex(size_t index) const;
float getTotalLength() const { return totalLength; }
void rebuildLUT(); // Предрасчет таблицы длин для константной скорости
private:
std::vector<SplinePoint> points;
struct LUTEntry {
float distance;
float t;
};
std::vector<LUTEntry> LUT;
float totalLength = 0;
glm::vec3 getPositionRaw(float t) const;
glm::vec3 getTangentRaw(float t) const;
};
+119
View File
@@ -0,0 +1,119 @@
#ifndef GL_LOADER_HPP
#define GL_LOADER_HPP
#if defined(_WIN32)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#endif
#include <SDL3/SDL.h>
#include <SDL3/SDL_opengl.h>
#ifndef APIENTRY
#define APIENTRY
#endif
#ifndef GL_FRAGMENT_SHADER
#define GL_FRAGMENT_SHADER 0x8B30
#endif
#ifndef GL_VERTEX_SHADER
#define GL_VERTEX_SHADER 0x8B31
#endif
#ifndef GL_ARRAY_BUFFER
#define GL_ARRAY_BUFFER 0x8892
#endif
#ifndef GL_STATIC_DRAW
#define GL_STATIC_DRAW 0x88E4
#endif
#ifndef GL_DYNAMIC_DRAW
#define GL_DYNAMIC_DRAW 0x88E8
#endif
#ifndef GL_ELEMENT_ARRAY_BUFFER
#define GL_ELEMENT_ARRAY_BUFFER 0x8893
#endif
#ifndef GL_PROGRAM_POINT_SIZE
#define GL_PROGRAM_POINT_SIZE 0x8642
#endif
typedef GLuint (APIENTRY *PFNGLCREATESHADERPROC)(GLenum type);
typedef void (APIENTRY *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);
typedef void (APIENTRY *PFNGLCOMPILESHADERPROC)(GLuint shader);
typedef GLuint (APIENTRY *PFNGLCREATEPROGRAMPROC)(void);
typedef void (APIENTRY *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader);
typedef void (APIENTRY *PFNGLLINKPROGRAMPROC)(GLuint program);
typedef void (APIENTRY *PFNGLUSEPROGRAMPROC)(GLuint program);
typedef void (APIENTRY *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint* arrays);
typedef void (APIENTRY *PFNGLBINDVERTEXARRAYPROC)(GLuint array);
typedef void (APIENTRY *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint* buffers);
typedef void (APIENTRY *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint* buffers);
typedef void (APIENTRY *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint* arrays);
typedef void (APIENTRY *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer);
typedef void (APIENTRY *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
typedef void (APIENTRY *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
typedef void (APIENTRY *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
typedef void (APIENTRY *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);
typedef GLint (APIENTRY *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar* name);
typedef void (APIENTRY *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0);
typedef void (APIENTRY *PFNGLUNIFORM1IPROC)(GLint location, GLint v0);
typedef void (APIENTRY *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat* value);
typedef void (APIENTRY *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
#ifdef GL_LOADER_IMPLEMENTATION
#define GL_EXTERN
#else
#define GL_EXTERN extern
#endif
GL_EXTERN PFNGLCREATESHADERPROC glCreateShader;
GL_EXTERN PFNGLSHADERSOURCEPROC glShaderSource;
GL_EXTERN PFNGLCOMPILESHADERPROC glCompileShader;
GL_EXTERN PFNGLCREATEPROGRAMPROC glCreateProgram;
GL_EXTERN PFNGLATTACHSHADERPROC glAttachShader;
GL_EXTERN PFNGLLINKPROGRAMPROC glLinkProgram;
GL_EXTERN PFNGLUSEPROGRAMPROC glUseProgram;
GL_EXTERN PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
GL_EXTERN PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
GL_EXTERN PFNGLGENBUFFERSPROC glGenBuffers;
GL_EXTERN PFNGLDELETEBUFFERSPROC glDeleteBuffers;
GL_EXTERN PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
GL_EXTERN PFNGLBINDBUFFERPROC glBindBuffer;
GL_EXTERN PFNGLBUFFERDATAPROC glBufferData;
GL_EXTERN PFNGLBUFFERSUBDATAPROC glBufferSubData;
GL_EXTERN PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
GL_EXTERN PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
GL_EXTERN PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
GL_EXTERN PFNGLUNIFORM1FPROC glUniform1f;
GL_EXTERN PFNGLUNIFORM1IPROC glUniform1i;
GL_EXTERN PFNGLUNIFORM3FVPROC glUniform3fv;
GL_EXTERN PFNGLUNIFORM4FVPROC glUniform4fv;
GL_EXTERN PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
inline void load_gl_functions() {
glCreateShader = (PFNGLCREATESHADERPROC)SDL_GL_GetProcAddress("glCreateShader");
glShaderSource = (PFNGLSHADERSOURCEPROC)SDL_GL_GetProcAddress("glShaderSource");
glCompileShader = (PFNGLCOMPILESHADERPROC)SDL_GL_GetProcAddress("glCompileShader");
glCreateProgram = (PFNGLCREATEPROGRAMPROC)SDL_GL_GetProcAddress("glCreateProgram");
glAttachShader = (PFNGLATTACHSHADERPROC)SDL_GL_GetProcAddress("glAttachShader");
glLinkProgram = (PFNGLLINKPROGRAMPROC)SDL_GL_GetProcAddress("glLinkProgram");
glUseProgram = (PFNGLUSEPROGRAMPROC)SDL_GL_GetProcAddress("glUseProgram");
glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)SDL_GL_GetProcAddress("glGenVertexArrays");
glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)SDL_GL_GetProcAddress("glBindVertexArray");
glGenBuffers = (PFNGLGENBUFFERSPROC)SDL_GL_GetProcAddress("glGenBuffers");
glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)SDL_GL_GetProcAddress("glDeleteBuffers");
glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)SDL_GL_GetProcAddress("glDeleteVertexArrays");
glBindBuffer = (PFNGLBINDBUFFERPROC)SDL_GL_GetProcAddress("glBindBuffer");
glBufferData = (PFNGLBUFFERDATAPROC)SDL_GL_GetProcAddress("glBufferData");
glBufferSubData = (PFNGLBUFFERSUBDATAPROC)SDL_GL_GetProcAddress("glBufferSubData");
glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)SDL_GL_GetProcAddress("glEnableVertexAttribArray");
glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)SDL_GL_GetProcAddress("glVertexAttribPointer");
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)SDL_GL_GetProcAddress("glGetUniformLocation");
glUniform1f = (PFNGLUNIFORM1FPROC)SDL_GL_GetProcAddress("glUniform1f");
glUniform1i = (PFNGLUNIFORM1IPROC)SDL_GL_GetProcAddress("glUniform1i");
glUniform3fv = (PFNGLUNIFORM3FVPROC)SDL_GL_GetProcAddress("glUniform3fv");
glUniform4fv = (PFNGLUNIFORM4FVPROC)SDL_GL_GetProcAddress("glUniform4fv");
glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)SDL_GL_GetProcAddress("glUniformMatrix4fv");
}
#endif