// Copyright (c) 2023 Alex Diener. All rights reserved. #include "PROJECT_NAME/Shaders.h" #include "stem_core.h" Shader * g_roomShader = NULL; #define EMBED_EXTERN(symbol_name) \ extern const char EMBEDDATA_##symbol_name[]; \ extern unsigned int EMBEDSIZE_##symbol_name #define createShaderWithEmbed(vert_symbol, frag_symbol, texture_count, attributes_array) \ Shader_create(EMBEDDATA_##vert_symbol##_vert, EMBEDSIZE_##vert_symbol##_vert, EMBEDDATA_##frag_symbol##_frag, EMBEDSIZE_##frag_symbol##_frag, texture_count, VertexFormat_create(sizeof_count(attributes_array), attributes_array), true) static Shader * createRoomShader(void) { EMBED_EXTERN(room_vert); EMBED_EXTERN(room_frag); VertexAttributeTypeSpec vertexAttributes[] = { {"position", ATTRIBUTE_TYPE_FLOAT, ATTRIBUTE_USAGE_POSITION, 2}, {"texCoord", ATTRIBUTE_TYPE_FLOAT, ATTRIBUTE_USAGE_TEXTURE_COORDINATE, 2}, {"color", ATTRIBUTE_TYPE_FLOAT, ATTRIBUTE_USAGE_COLOR, 4} }; Shader * shader = createShaderWithEmbed(room, room, 1, vertexAttributes); Shader_specifyUniform(shader, ATOM("projectionTransform"), UNIFORM_TYPE_mat4, 0); Shader_specifyUniform(shader, ATOM("viewTransform"), UNIFORM_TYPE_mat4, 0); Shader_specifyUniform(shader, ATOM("colorTexture"), UNIFORM_TYPE_1i, 0); return shader; } void initShaders(void) { g_roomShader = createRoomShader(); }