176 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "graphics.h"
 | |
| 
 | |
| #include <kinc/graphics4/graphics.h>
 | |
| #include <kinc/graphics4/indexbuffer.h>
 | |
| #include <kinc/graphics4/pipeline.h>
 | |
| #include <kinc/graphics4/shader.h>
 | |
| #include <kinc/graphics4/texture.h>
 | |
| #include <kinc/graphics4/vertexbuffer.h>
 | |
| #include <kinc/io/filereader.h>
 | |
| 
 | |
| #ifdef KINC_KONG
 | |
| #include <kong.h>
 | |
| #endif
 | |
| 
 | |
| #ifndef KINC_KONG
 | |
| static kinc_g4_shader_t vertexShader;
 | |
| static kinc_g4_shader_t fragmentShader;
 | |
| static kinc_g4_pipeline_t pipeline;
 | |
| static kinc_g4_texture_unit_t tex;
 | |
| #endif
 | |
| static kinc_g4_vertex_buffer_t vb;
 | |
| static kinc_g4_index_buffer_t ib;
 | |
| static kinc_g4_texture_t texture;
 | |
| 
 | |
| uint32_t *kinc_internal_g1_image;
 | |
| int kinc_internal_g1_w, kinc_internal_g1_h, kinc_internal_g1_tex_width;
 | |
| 
 | |
| void kinc_g1_begin(void) {
 | |
| 	kinc_g4_begin(0);
 | |
| 	kinc_internal_g1_image = (uint32_t *)kinc_g4_texture_lock(&texture);
 | |
| }
 | |
| 
 | |
| void kinc_g1_end(void) {
 | |
| 	kinc_internal_g1_image = NULL;
 | |
| 	kinc_g4_texture_unlock(&texture);
 | |
| 
 | |
| 	kinc_g4_clear(KINC_G4_CLEAR_COLOR, 0xff000000, 0.0f, 0);
 | |
| 
 | |
| #ifdef KINC_KONG
 | |
| 	kinc_g4_set_pipeline(&kinc_g1_pipeline);
 | |
| #else
 | |
| 	kinc_g4_set_pipeline(&pipeline);
 | |
| #endif
 | |
| 
 | |
| #ifndef KINC_KONG
 | |
| 	kinc_g4_set_texture(tex, &texture);
 | |
| #endif
 | |
| 	kinc_g4_set_vertex_buffer(&vb);
 | |
| 	kinc_g4_set_index_buffer(&ib);
 | |
| 	kinc_g4_draw_indexed_vertices();
 | |
| 
 | |
| 	kinc_g4_end(0);
 | |
| 	kinc_g4_swap_buffers();
 | |
| }
 | |
| 
 | |
| void kinc_g1_init(int width, int height) {
 | |
| 	kinc_internal_g1_w = width;
 | |
| 	kinc_internal_g1_h = height;
 | |
| 
 | |
| #ifndef KINC_KONG
 | |
| 	{
 | |
| 		kinc_file_reader_t file;
 | |
| 		kinc_file_reader_open(&file, "g1.vert", KINC_FILE_TYPE_ASSET);
 | |
| 		void *data = malloc(kinc_file_reader_size(&file));
 | |
| 		kinc_file_reader_read(&file, data, kinc_file_reader_size(&file));
 | |
| 		kinc_file_reader_close(&file);
 | |
| 		kinc_g4_shader_init(&vertexShader, data, kinc_file_reader_size(&file), KINC_G4_SHADER_TYPE_VERTEX);
 | |
| 		free(data);
 | |
| 	}
 | |
| 
 | |
| 	{
 | |
| 		kinc_file_reader_t file;
 | |
| 		kinc_file_reader_open(&file, "g1.frag", KINC_FILE_TYPE_ASSET);
 | |
| 		void *data = malloc(kinc_file_reader_size(&file));
 | |
| 		kinc_file_reader_read(&file, data, kinc_file_reader_size(&file));
 | |
| 		kinc_file_reader_close(&file);
 | |
| 		kinc_g4_shader_init(&fragmentShader, data, kinc_file_reader_size(&file), KINC_G4_SHADER_TYPE_FRAGMENT);
 | |
| 		free(data);
 | |
| 	}
 | |
| 
 | |
| 	kinc_g4_vertex_structure_t structure;
 | |
| 	kinc_g4_vertex_structure_init(&structure);
 | |
| 	kinc_g4_vertex_structure_add(&structure, "pos", KINC_G4_VERTEX_DATA_F32_3X);
 | |
| 	kinc_g4_vertex_structure_add(&structure, "tex", KINC_G4_VERTEX_DATA_F32_2X);
 | |
| 	kinc_g4_pipeline_init(&pipeline);
 | |
| 	pipeline.input_layout[0] = &structure;
 | |
| 	pipeline.input_layout[1] = NULL;
 | |
| 	pipeline.vertex_shader = &vertexShader;
 | |
| 	pipeline.fragment_shader = &fragmentShader;
 | |
| 	kinc_g4_pipeline_compile(&pipeline);
 | |
| 
 | |
| 	tex = kinc_g4_pipeline_get_texture_unit(&pipeline, "texy");
 | |
| #endif
 | |
| 
 | |
| 	kinc_g4_texture_init(&texture, width, height, KINC_IMAGE_FORMAT_RGBA32);
 | |
| 	kinc_internal_g1_tex_width = texture.tex_width;
 | |
| 
 | |
| 	kinc_internal_g1_image = (uint32_t *)kinc_g4_texture_lock(&texture);
 | |
| 	int stride = kinc_g4_texture_stride(&texture) / 4;
 | |
| 	for (int y = 0; y < texture.tex_height; ++y) {
 | |
| 		for (int x = 0; x < texture.tex_width; ++x) {
 | |
| 			kinc_internal_g1_image[y * stride + x] = 0;
 | |
| 		}
 | |
| 	}
 | |
| 	kinc_g4_texture_unlock(&texture);
 | |
| 
 | |
| 	// Correct for the difference between the texture's desired size and the actual power of 2 size
 | |
| 	float xAspect = (float)width / texture.tex_width;
 | |
| 	float yAspect = (float)height / texture.tex_height;
 | |
| 
 | |
| #ifdef KINC_KONG
 | |
| 	kinc_g4_vertex_buffer_init(&vb, 4, &kinc_g1_vertex_in_structure, KINC_G4_USAGE_STATIC, 0);
 | |
| #else
 | |
| 	kinc_g4_vertex_buffer_init(&vb, 4, &structure, KINC_G4_USAGE_STATIC, 0);
 | |
| #endif
 | |
| 	float *v = kinc_g4_vertex_buffer_lock_all(&vb);
 | |
| 	{
 | |
| 		int i = 0;
 | |
| 		v[i++] = -1;
 | |
| 		v[i++] = 1;
 | |
| 		v[i++] = 0.5;
 | |
| 		v[i++] = 0;
 | |
| 		v[i++] = 0;
 | |
| 		v[i++] = 1;
 | |
| 		v[i++] = 1;
 | |
| 		v[i++] = 0.5;
 | |
| 		v[i++] = xAspect;
 | |
| 		v[i++] = 0;
 | |
| 		v[i++] = 1;
 | |
| 		v[i++] = -1;
 | |
| 		v[i++] = 0.5;
 | |
| 		v[i++] = xAspect;
 | |
| 		v[i++] = yAspect;
 | |
| 		v[i++] = -1;
 | |
| 		v[i++] = -1;
 | |
| 		v[i++] = 0.5;
 | |
| 		v[i++] = 0;
 | |
| 		v[i++] = yAspect;
 | |
| 	}
 | |
| 	kinc_g4_vertex_buffer_unlock_all(&vb);
 | |
| 
 | |
| 	kinc_g4_index_buffer_init(&ib, 6, KINC_G4_INDEX_BUFFER_FORMAT_32BIT, KINC_G4_USAGE_STATIC);
 | |
| 	uint32_t *ii = (uint32_t *)kinc_g4_index_buffer_lock_all(&ib);
 | |
| 	{
 | |
| 		int i = 0;
 | |
| 		ii[i++] = 0;
 | |
| 		ii[i++] = 1;
 | |
| 		ii[i++] = 3;
 | |
| 		ii[i++] = 1;
 | |
| 		ii[i++] = 2;
 | |
| 		ii[i++] = 3;
 | |
| 	}
 | |
| 	kinc_g4_index_buffer_unlock_all(&ib);
 | |
| }
 | |
| 
 | |
| #if defined(KINC_DYNAMIC_COMPILE) || defined(KINC_DYNAMIC)
 | |
| 
 | |
| void kinc_g1_set_pixel(int x, int y, float red, float green, float blue) {
 | |
| 	if (x < 0 || x >= kinc_internal_g1_w || y < 0 || y >= kinc_internal_g1_h)
 | |
| 		return;
 | |
| 	int r = (int)(red * 255);
 | |
| 	int g = (int)(green * 255);
 | |
| 	int b = (int)(blue * 255);
 | |
| 	kinc_internal_g1_image[y * kinc_internal_g1_tex_width + x] = 0xff << 24 | b << 16 | g << 8 | r;
 | |
| }
 | |
| 
 | |
| int kinc_g1_width() {
 | |
| 	return kinc_internal_g1_w;
 | |
| }
 | |
| 
 | |
| int kinc_g1_height() {
 | |
| 	return kinc_internal_g1_h;
 | |
| }
 | |
| 
 | |
| #endif
 |