diff --git a/include/api.h b/include/api.h new file mode 100644 index 0000000..ab351fe --- /dev/null +++ b/include/api.h @@ -0,0 +1,138 @@ +#ifndef _API_H +#define _API_H + +#include +#include + +typedef int Error; + +#define ERROR_NONE 0 +#define ERROR_OUT_OF_MEMORY 1 +#define ERROR_OUT_OF_BLOCKS 2 +#define ERROR_OUT_OF_MATERIALS 3 +#define ERROR_OUT_OF_TEXTURES 4 + +typedef int Orientation; + +#define ORIENTATION_NEGATIVE_X ~0 +#define ORIENTATION_POSITIVE_X 0 +#define ORIENTATION_NEGATIVE_Y ~1 +#define ORIENTATION_POSITIVE_Y 1 +#define ORIENTATION_NEGATIVE_Z ~2 +#define ORIENTATION_POSITIVE_Z 2 + +#define ORIENTATION_INIT_SIGN_INDEX(sign, index) ((sign) > 0 ? (index) : ~(index)) +#define ORIENTATION_GET_INDEX(orientation) ((orientation) & 0x4 ? ~(orientation) : (orientation)) +#define ORIENTATION_GET_SIGN(orientation) ((oritentation) & 0x4 ? -1 : 1) + +typedef int Transform; + +#define TRANSFORM_IDENTITY 0 +#define TRANSFORM_ROTATE_CW 1 +#define TRANSFORM_ROTATE_CCW 2 +#define TRANSFORM_ROTATE_180 3 +#define TRANSFORM_MIRROR 4 +#define TRANSFORM_MIRROR_ROTATE_CW 5 +#define TRANSFORM_MIRROR_ROTATE_CCW 6 +#define TRANSFORM_MIRROR_ROTATE_180 7 + +typedef unsigned short BlockId; + +#define BLOCK_ID_AIR 0 + +typedef unsigned short MaterialId; + +#define MATERIAL_ID_EMPTY 0 + +typedef unsigned short TextureId; + +#define TEXTURE_ID_EMPTY_BASE_COLOR 0 +#define TEXTURE_ID_EMPTY_EMISSIVE 1 +#define TEXTURE_ID_EMPTY_NORMAL 2 +#define TEXTURE_ID_EMPTY_OCCLUSION_ROUGHNESS_METALLIC 3 + +typedef int TextureUsage; + +#define TEXTURE_USAGE_BASE_COLOR 0 +#define TEXTURE_USAGE_NORMAL 1 +#define TEXTURE_USAGE_OCCLUSION_ROUGHNESS_METALLIC 2 +#define TEXTURE_USAGE_EMISSIVE 3 + +typedef struct String { + const char* ptr; + size_t len; +} String; + +#define STRING_NULL (String){ .ptr = NULL, .len = 0 } + +typedef struct BlockDefinitionWall { + MaterialId material; + Transform transform; +} BlockDefinitionWall; + +typedef struct BlockDefinitionWalls { + BlockDefinitionWall negative_x; + BlockDefinitionWall positive_x; + BlockDefinitionWall negative_y; + BlockDefinitionWall positive_y; + BlockDefinitionWall negative_z; + BlockDefinitionWall positive_z; +} BlockDefinitionWalls; + +typedef struct BlockDefinition { + BlockDefinitionWalls walls; +} BlockDefinition; + +typedef struct MaterialDefinition { + vec3_t base_color; + vec3_t emissive; + float ior; + float metallic; + float normal_scale; + float occlusion_texture_strength; + float roughness; + + TextureId base_color_texture; + TextureId emissive_texture; + TextureId normal_texture; + TextureId occlusion_roughness_metallic_texture; +} MaterialDefinition; + +typedef struct TextureData { + TextureUsage usage; + unsigned int width; + unsigned int height; + const char *data; +} TextureData; + +typedef struct TextureDataMutable { + TextureUsage usage; + unsigned int width; + unsigned int height; + char *data; +} TextureDataMutable; + +Error BlockIdFromName(String name, bool *exists, BlockId *out); +Error BlockDefinitionFromId(BlockId id, const BlockDefinition **out); +Error BlockDefine(String name, const BlockDefinition *definition, BlockId *out); + +Error MaterialIdFromName(String name, bool *exists, MaterialId *out); +Error MaterialDefinitionFromId(MaterialId, const MaterialDefinition **out); +Error MaterialDefine(String name, const MaterialDefinition *definition, MaterialId *out); + +Error TextureIdFromName(String name, TextureUsage usage, bool *exists, TextureId *out); +Error TextureDefine(String name, const TextureData *texture_data, TextureId *out); + +Error TextureResize(TextureDataMutable *texture_data, unsigned int width, unsigned int height); + +// --- CALLBACKS --- + +void PreInit(); +void PostInit(); +void Deinit(); + +void FilterBlock(BlockId id, String name, bool *exists, BlockDefinition *definition); +void FilterMaterial(MaterialId id, String name, bool *exists, MaterialDefinition *definition); +void FilterTexture(TextureId id, String name, bool *exists, TextureDataMutable *texture_data); + +#endif diff --git a/include/stdafx.h b/include/stdafx.h new file mode 100644 index 0000000..c06d92e --- /dev/null +++ b/include/stdafx.h @@ -0,0 +1,27 @@ +#ifndef _STDAFX_H +#define _STDAFX_H + +typedef unsigned long size_t; +typedef long ssize_t; +typedef long ptrdiff_t; +typedef long intptr_t; +typedef unsigned long uintptr_t; + +#define NULL ((void *)0) + +#define bool _Bool +#define true 1 +#define false 0 +#define __bool_true_false_are_defined 1 + +typedef signed char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long int64_t; + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long uint64_t; + +#endif diff --git a/include/vecmath.h b/include/vecmath.h new file mode 100644 index 0000000..7f59690 --- /dev/null +++ b/include/vecmath.h @@ -0,0 +1,58 @@ +#ifndef _VECMATH_H +#define _VECMATH_H + +typedef union vec2_t { + struct { + float x; + float y; + }; + float v[2]; +} vec2_t; + +typedef union vec3_t { + struct { + float x; + float y; + float z; + }; + float v[3]; +} vec3_t; + +typedef union vec4_t { + struct { + float x; + float y; + float z; + float w; + }; + float v[4]; +} vec4_t; + +typedef union ivec2_t { + struct { + int x; + int y; + }; + int v[2]; +} vec2_t; + +typedef union ivec3_t { + struct { + int x; + int y; + int z; + }; + int v[3]; +} vec3_t; + +typedef union ivec4_t { + struct { + int x; + int y; + int z; + int w; + }; + int v[4]; +} vec4_t; + +#endif diff --git a/src/assets/Textures.zig b/src/assets/Textures.zig index fd76300..a6ff3f3 100644 --- a/src/assets/Textures.zig +++ b/src/assets/Textures.zig @@ -141,7 +141,7 @@ pub fn deinit(self: *Textures, engine: *Engine, allocator: std.mem.Allocator) vo /// Get the ID of a texture given its filename (as a string) and usage. Returns /// `null` if such texture hasn't been loaded. When the filename is `null`, /// returns an empty texture ID appropriate for given usage. -pub fn get(self: *const Textures, maybe_filename: []const u8, usage: Texture.Usage) ?Id { +pub fn get(self: *const Textures, maybe_filename: ?[]const u8, usage: Texture.Usage) ?Id { if (maybe_filename) |filename| { return self.map.get(.{ // If the atom doesn't exist, then the texture cannot possibly exist. diff --git a/src/voxels.zig b/src/voxels.zig index 92f7cfc..e24c9f9 100644 --- a/src/voxels.zig +++ b/src/voxels.zig @@ -51,14 +51,14 @@ pub const Orientation = enum(u3) { }; pub const Transform = enum(u3) { - identity, - rotate_cw, - rotate_ccw, - rotate_180, - mirror, - mirror_rotate_cw, - mirror_rotate_ccw, - mirror_rotate_180, + identity = 0, + rotate_cw = 1, + rotate_ccw = 2, + rotate_180 = 3, + mirror = 4, + mirror_rotate_cw = 5, + mirror_rotate_ccw = 6, + mirror_rotate_180 = 7, }; // ┌──────────────────── x