// 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();
}
