Initial Vectorail Core library
This commit is contained in:
@@ -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);
|
||||
@@ -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);
|
||||
@@ -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));
|
||||
}
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user