Switching to C
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,3 +1,4 @@ | ||||
| # Godot 4+ specific ignores | ||||
| .godot/ | ||||
| /Assets/ | ||||
| /game/tenchu | ||||
|  | ||||
							
								
								
									
										2
									
								
								Godot/.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,2 @@ | ||||
| # Normalize EOL for all files that Git considers text files. | ||||
| * text=auto eol=lf | ||||
							
								
								
									
										2
									
								
								Godot/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,2 @@ | ||||
| # Godot 4+ specific ignores | ||||
| .godot/ | ||||
| Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB | 
| Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB | 
| Before Width: | Height: | Size: 1021 B After Width: | Height: | Size: 1021 B | 
| Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB | 
| Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB | 
							
								
								
									
										1
									
								
								Godot/icon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | ||||
| <svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 813 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H447l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c3 34 55 34 58 0v-86c-3-34-55-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg> | ||||
| After Width: | Height: | Size: 950 B | 
							
								
								
									
										37
									
								
								Godot/icon.svg.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,37 @@ | ||||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://daioe8i125w8d" | ||||
| path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://icon.svg" | ||||
| dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] | ||||
| 
 | ||||
| [params] | ||||
| 
 | ||||
| compress/mode=0 | ||||
| compress/high_quality=false | ||||
| compress/lossy_quality=0.7 | ||||
| compress/hdr_compression=1 | ||||
| compress/normal_map=0 | ||||
| compress/channel_pack=0 | ||||
| mipmaps/generate=false | ||||
| mipmaps/limit=-1 | ||||
| roughness/mode=0 | ||||
| roughness/src_normal="" | ||||
| process/fix_alpha_border=true | ||||
| process/premult_alpha=false | ||||
| process/normal_map_invert_y=false | ||||
| process/hdr_as_srgb=false | ||||
| process/hdr_clamp_exposure=false | ||||
| process/size_limit=0 | ||||
| detect_3d/compress_to=1 | ||||
| svg/scale=1.0 | ||||
| editor/scale_with_editor_scale=false | ||||
| editor/convert_colors_with_editor_theme=false | ||||
							
								
								
									
										2
									
								
								game/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,2 @@ | ||||
| /libs/glad/glad.o | ||||
| /opengl | ||||
							
								
								
									
										20
									
								
								game/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,20 @@ | ||||
| P=tenchu | ||||
| OBJECTS= | ||||
| CFLAGS=-g -Wall -Wextra -O0 | ||||
| LDLIBS=-lglfw -lOpenGL  | ||||
| INCLUDES=-I./libs/glad/include/ | ||||
| CC=gcc | ||||
| RM=rm -vf | ||||
| 
 | ||||
| .PHONY: build | ||||
| build: clean | ||||
| 	$(CC) $(CFLAGS) $(LDLIBS) $(INCLUDES) libs/glad/glad.o tenchu.c -o $(P) | ||||
| 
 | ||||
| .PHONY: run | ||||
| run: build | ||||
| 	./$(P) | ||||
| 
 | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	$(RM) $(P) | ||||
| 
 | ||||
							
								
								
									
										21
									
								
								game/README.org
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,21 @@ | ||||
| #+OPTIONS: toc:nil | ||||
| 
 | ||||
| * Installing on Fedora | ||||
| #+begin_src shell | ||||
| sudo dnf install glfw-devl glad | ||||
| #+end_src | ||||
| 
 | ||||
| Then run the glad command | ||||
| 
 | ||||
| #+begin_src shell | ||||
| glad --profile core --generator c --out-path libs/glad | ||||
| #+end_src | ||||
| 
 | ||||
| For faster compilation, compile glad; | ||||
| 
 | ||||
| #+begin_src shell | ||||
| gcc -Ilibs/glad/include/ -c libs/glad/src/glad.c | ||||
| #+end_src | ||||
| * Terms | ||||
| VBO - vertex buffer objects | ||||
| VAO - vertex array object | ||||
							
								
								
									
										311
									
								
								game/libs/glad/include/KHR/khrplatform.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,311 @@ | ||||
| #ifndef __khrplatform_h_ | ||||
| #define __khrplatform_h_ | ||||
| 
 | ||||
| /*
 | ||||
| ** Copyright (c) 2008-2018 The Khronos Group Inc. | ||||
| ** | ||||
| ** Permission is hereby granted, free of charge, to any person obtaining a | ||||
| ** copy of this software and/or associated documentation files (the | ||||
| ** "Materials"), to deal in the Materials without restriction, including | ||||
| ** without limitation the rights to use, copy, modify, merge, publish, | ||||
| ** distribute, sublicense, and/or sell copies of the Materials, and to | ||||
| ** permit persons to whom the Materials are furnished to do so, subject to | ||||
| ** the following conditions: | ||||
| ** | ||||
| ** The above copyright notice and this permission notice shall be included | ||||
| ** in all copies or substantial portions of the Materials. | ||||
| ** | ||||
| ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
| ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||||
| ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||||
| ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||
| ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. | ||||
| */ | ||||
| 
 | ||||
| /* Khronos platform-specific types and definitions.
 | ||||
|  * | ||||
|  * The master copy of khrplatform.h is maintained in the Khronos EGL | ||||
|  * Registry repository at https://github.com/KhronosGroup/EGL-Registry
 | ||||
|  * The last semantic modification to khrplatform.h was at commit ID: | ||||
|  *      67a3e0864c2d75ea5287b9f3d2eb74a745936692 | ||||
|  * | ||||
|  * Adopters may modify this file to suit their platform. Adopters are | ||||
|  * encouraged to submit platform specific modifications to the Khronos | ||||
|  * group so that they can be included in future versions of this file. | ||||
|  * Please submit changes by filing pull requests or issues on | ||||
|  * the EGL Registry repository linked above. | ||||
|  * | ||||
|  * | ||||
|  * See the Implementer's Guidelines for information about where this file | ||||
|  * should be located on your system and for more details of its use: | ||||
|  *    http://www.khronos.org/registry/implementers_guide.pdf
 | ||||
|  * | ||||
|  * This file should be included as | ||||
|  *        #include <KHR/khrplatform.h> | ||||
|  * by Khronos client API header files that use its types and defines. | ||||
|  * | ||||
|  * The types in khrplatform.h should only be used to define API-specific types. | ||||
|  * | ||||
|  * Types defined in khrplatform.h: | ||||
|  *    khronos_int8_t              signed   8  bit | ||||
|  *    khronos_uint8_t             unsigned 8  bit | ||||
|  *    khronos_int16_t             signed   16 bit | ||||
|  *    khronos_uint16_t            unsigned 16 bit | ||||
|  *    khronos_int32_t             signed   32 bit | ||||
|  *    khronos_uint32_t            unsigned 32 bit | ||||
|  *    khronos_int64_t             signed   64 bit | ||||
|  *    khronos_uint64_t            unsigned 64 bit | ||||
|  *    khronos_intptr_t            signed   same number of bits as a pointer | ||||
|  *    khronos_uintptr_t           unsigned same number of bits as a pointer | ||||
|  *    khronos_ssize_t             signed   size | ||||
|  *    khronos_usize_t             unsigned size | ||||
|  *    khronos_float_t             signed   32 bit floating point | ||||
|  *    khronos_time_ns_t           unsigned 64 bit time in nanoseconds | ||||
|  *    khronos_utime_nanoseconds_t unsigned time interval or absolute time in | ||||
|  *                                         nanoseconds | ||||
|  *    khronos_stime_nanoseconds_t signed time interval in nanoseconds | ||||
|  *    khronos_boolean_enum_t      enumerated boolean type. This should | ||||
|  *      only be used as a base type when a client API's boolean type is | ||||
|  *      an enum. Client APIs which use an integer or other type for | ||||
|  *      booleans cannot use this as the base type for their boolean. | ||||
|  * | ||||
|  * Tokens defined in khrplatform.h: | ||||
|  * | ||||
|  *    KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. | ||||
|  * | ||||
|  *    KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. | ||||
|  *    KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. | ||||
|  * | ||||
|  * Calling convention macros defined in this file: | ||||
|  *    KHRONOS_APICALL | ||||
|  *    KHRONOS_APIENTRY | ||||
|  *    KHRONOS_APIATTRIBUTES | ||||
|  * | ||||
|  * These may be used in function prototypes as: | ||||
|  * | ||||
|  *      KHRONOS_APICALL void KHRONOS_APIENTRY funcname( | ||||
|  *                                  int arg1, | ||||
|  *                                  int arg2) KHRONOS_APIATTRIBUTES; | ||||
|  */ | ||||
| 
 | ||||
| #if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) | ||||
| #   define KHRONOS_STATIC 1 | ||||
| #endif | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------
 | ||||
|  * Definition of KHRONOS_APICALL | ||||
|  *------------------------------------------------------------------------- | ||||
|  * This precedes the return type of the function in the function prototype. | ||||
|  */ | ||||
| #if defined(KHRONOS_STATIC) | ||||
|     /* If the preprocessor constant KHRONOS_STATIC is defined, make the
 | ||||
|      * header compatible with static linking. */ | ||||
| #   define KHRONOS_APICALL | ||||
| #elif defined(_WIN32) | ||||
| #   define KHRONOS_APICALL __declspec(dllimport) | ||||
| #elif defined (__SYMBIAN32__) | ||||
| #   define KHRONOS_APICALL IMPORT_C | ||||
| #elif defined(__ANDROID__) | ||||
| #   define KHRONOS_APICALL __attribute__((visibility("default"))) | ||||
| #else | ||||
| #   define KHRONOS_APICALL | ||||
| #endif | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------
 | ||||
|  * Definition of KHRONOS_APIENTRY | ||||
|  *------------------------------------------------------------------------- | ||||
|  * This follows the return type of the function  and precedes the function | ||||
|  * name in the function prototype. | ||||
|  */ | ||||
| #if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) | ||||
|     /* Win32 but not WinCE */ | ||||
| #   define KHRONOS_APIENTRY __stdcall | ||||
| #else | ||||
| #   define KHRONOS_APIENTRY | ||||
| #endif | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------
 | ||||
|  * Definition of KHRONOS_APIATTRIBUTES | ||||
|  *------------------------------------------------------------------------- | ||||
|  * This follows the closing parenthesis of the function prototype arguments. | ||||
|  */ | ||||
| #if defined (__ARMCC_2__) | ||||
| #define KHRONOS_APIATTRIBUTES __softfp | ||||
| #else | ||||
| #define KHRONOS_APIATTRIBUTES | ||||
| #endif | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------
 | ||||
|  * basic type definitions | ||||
|  *-----------------------------------------------------------------------*/ | ||||
| #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Using <stdint.h> | ||||
|  */ | ||||
| #include <stdint.h> | ||||
| typedef int32_t                 khronos_int32_t; | ||||
| typedef uint32_t                khronos_uint32_t; | ||||
| typedef int64_t                 khronos_int64_t; | ||||
| typedef uint64_t                khronos_uint64_t; | ||||
| #define KHRONOS_SUPPORT_INT64   1 | ||||
| #define KHRONOS_SUPPORT_FLOAT   1 | ||||
| /*
 | ||||
|  * To support platform where unsigned long cannot be used interchangeably with | ||||
|  * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. | ||||
|  * Ideally, we could just use (u)intptr_t everywhere, but this could result in | ||||
|  * ABI breakage if khronos_uintptr_t is changed from unsigned long to | ||||
|  * unsigned long long or similar (this results in different C++ name mangling). | ||||
|  * To avoid changes for existing platforms, we restrict usage of intptr_t to | ||||
|  * platforms where the size of a pointer is larger than the size of long. | ||||
|  */ | ||||
| #if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) | ||||
| #if __SIZEOF_POINTER__ > __SIZEOF_LONG__ | ||||
| #define KHRONOS_USE_INTPTR_T | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #elif defined(__VMS ) || defined(__sgi) | ||||
| 
 | ||||
| /*
 | ||||
|  * Using <inttypes.h> | ||||
|  */ | ||||
| #include <inttypes.h> | ||||
| typedef int32_t                 khronos_int32_t; | ||||
| typedef uint32_t                khronos_uint32_t; | ||||
| typedef int64_t                 khronos_int64_t; | ||||
| typedef uint64_t                khronos_uint64_t; | ||||
| #define KHRONOS_SUPPORT_INT64   1 | ||||
| #define KHRONOS_SUPPORT_FLOAT   1 | ||||
| 
 | ||||
| #elif defined(_WIN32) && !defined(__SCITECH_SNAP__) | ||||
| 
 | ||||
| /*
 | ||||
|  * Win32 | ||||
|  */ | ||||
| typedef __int32                 khronos_int32_t; | ||||
| typedef unsigned __int32        khronos_uint32_t; | ||||
| typedef __int64                 khronos_int64_t; | ||||
| typedef unsigned __int64        khronos_uint64_t; | ||||
| #define KHRONOS_SUPPORT_INT64   1 | ||||
| #define KHRONOS_SUPPORT_FLOAT   1 | ||||
| 
 | ||||
| #elif defined(__sun__) || defined(__digital__) | ||||
| 
 | ||||
| /*
 | ||||
|  * Sun or Digital | ||||
|  */ | ||||
| typedef int                     khronos_int32_t; | ||||
| typedef unsigned int            khronos_uint32_t; | ||||
| #if defined(__arch64__) || defined(_LP64) | ||||
| typedef long int                khronos_int64_t; | ||||
| typedef unsigned long int       khronos_uint64_t; | ||||
| #else | ||||
| typedef long long int           khronos_int64_t; | ||||
| typedef unsigned long long int  khronos_uint64_t; | ||||
| #endif /* __arch64__ */ | ||||
| #define KHRONOS_SUPPORT_INT64   1 | ||||
| #define KHRONOS_SUPPORT_FLOAT   1 | ||||
| 
 | ||||
| #elif 0 | ||||
| 
 | ||||
| /*
 | ||||
|  * Hypothetical platform with no float or int64 support | ||||
|  */ | ||||
| typedef int                     khronos_int32_t; | ||||
| typedef unsigned int            khronos_uint32_t; | ||||
| #define KHRONOS_SUPPORT_INT64   0 | ||||
| #define KHRONOS_SUPPORT_FLOAT   0 | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| /*
 | ||||
|  * Generic fallback | ||||
|  */ | ||||
| #include <stdint.h> | ||||
| typedef int32_t                 khronos_int32_t; | ||||
| typedef uint32_t                khronos_uint32_t; | ||||
| typedef int64_t                 khronos_int64_t; | ||||
| typedef uint64_t                khronos_uint64_t; | ||||
| #define KHRONOS_SUPPORT_INT64   1 | ||||
| #define KHRONOS_SUPPORT_FLOAT   1 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Types that are (so far) the same on all platforms | ||||
|  */ | ||||
| typedef signed   char          khronos_int8_t; | ||||
| typedef unsigned char          khronos_uint8_t; | ||||
| typedef signed   short int     khronos_int16_t; | ||||
| typedef unsigned short int     khronos_uint16_t; | ||||
| 
 | ||||
| /*
 | ||||
|  * Types that differ between LLP64 and LP64 architectures - in LLP64, | ||||
|  * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears | ||||
|  * to be the only LLP64 architecture in current use. | ||||
|  */ | ||||
| #ifdef KHRONOS_USE_INTPTR_T | ||||
| typedef intptr_t               khronos_intptr_t; | ||||
| typedef uintptr_t              khronos_uintptr_t; | ||||
| #elif defined(_WIN64) | ||||
| typedef signed   long long int khronos_intptr_t; | ||||
| typedef unsigned long long int khronos_uintptr_t; | ||||
| #else | ||||
| typedef signed   long  int     khronos_intptr_t; | ||||
| typedef unsigned long  int     khronos_uintptr_t; | ||||
| #endif | ||||
| 
 | ||||
| #if defined(_WIN64) | ||||
| typedef signed   long long int khronos_ssize_t; | ||||
| typedef unsigned long long int khronos_usize_t; | ||||
| #else | ||||
| typedef signed   long  int     khronos_ssize_t; | ||||
| typedef unsigned long  int     khronos_usize_t; | ||||
| #endif | ||||
| 
 | ||||
| #if KHRONOS_SUPPORT_FLOAT | ||||
| /*
 | ||||
|  * Float type | ||||
|  */ | ||||
| typedef          float         khronos_float_t; | ||||
| #endif | ||||
| 
 | ||||
| #if KHRONOS_SUPPORT_INT64 | ||||
| /* Time types
 | ||||
|  * | ||||
|  * These types can be used to represent a time interval in nanoseconds or | ||||
|  * an absolute Unadjusted System Time.  Unadjusted System Time is the number | ||||
|  * of nanoseconds since some arbitrary system event (e.g. since the last | ||||
|  * time the system booted).  The Unadjusted System Time is an unsigned | ||||
|  * 64 bit value that wraps back to 0 every 584 years.  Time intervals | ||||
|  * may be either signed or unsigned. | ||||
|  */ | ||||
| typedef khronos_uint64_t       khronos_utime_nanoseconds_t; | ||||
| typedef khronos_int64_t        khronos_stime_nanoseconds_t; | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Dummy value used to pad enum types to 32 bits. | ||||
|  */ | ||||
| #ifndef KHRONOS_MAX_ENUM | ||||
| #define KHRONOS_MAX_ENUM 0x7FFFFFFF | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Enumerated boolean type | ||||
|  * | ||||
|  * Values other than zero should be considered to be true.  Therefore | ||||
|  * comparisons should not be made against KHRONOS_TRUE. | ||||
|  */ | ||||
| typedef enum { | ||||
|     KHRONOS_FALSE = 0, | ||||
|     KHRONOS_TRUE  = 1, | ||||
|     KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM | ||||
| } khronos_boolean_enum_t; | ||||
| 
 | ||||
| #endif /* __khrplatform_h_ */ | ||||
							
								
								
									
										15905
									
								
								game/libs/glad/include/glad/glad.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										9431
									
								
								game/libs/glad/src/glad.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										153
									
								
								game/tenchu.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,153 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdbool.h> | ||||
| #include "glad/glad.h" | ||||
| #include <GLFW/glfw3.h> | ||||
| 
 | ||||
| int SCREEN_WIDTH = 1024; | ||||
| int SCREEN_HEIGHT = 768; | ||||
| 
 | ||||
| void checkCode(int code, char* errorMsg) { | ||||
|     if (code < 0) { | ||||
|         fprintf(stderr, "Application Error %i: %s\n", code, errorMsg); | ||||
|         exit(1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void* checkPtr(void *ptr, char* errorMsg) { | ||||
|     if (ptr == NULL) { | ||||
|         fprintf(stderr, "Application Error: %s\n", errorMsg); | ||||
|         exit(1); | ||||
|     } | ||||
|     return ptr; | ||||
| } | ||||
| 
 | ||||
| void checkShader(unsigned int shader, int statusFlag, char* actionName) { | ||||
|     int success; | ||||
|     glGetShaderiv(shader, statusFlag, &success); | ||||
|     if (success < 0) { | ||||
|         fprintf(stderr, "%s Error %i\n", actionName, success); | ||||
|         exit(1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void framebuffer_size_callback(GLFWwindow* window, int width, int height) | ||||
| { | ||||
|     (void)window; | ||||
|     glViewport(0, 0, width, height); | ||||
|     SCREEN_WIDTH = width; | ||||
|     SCREEN_HEIGHT = height; | ||||
| } | ||||
| 
 | ||||
| void processInput(GLFWwindow *window) | ||||
| { | ||||
|     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) | ||||
|         glfwSetWindowShouldClose(window, true); | ||||
| } | ||||
| 
 | ||||
| const char* vertSrc = | ||||
|     "#version 330 core\n" | ||||
|     "layout (location = 0) in vec3 aPos;\n" | ||||
|     "\n" | ||||
|     "void main()\n" | ||||
|     "{\n" | ||||
|     "    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" | ||||
|     "}\n"; | ||||
| 
 | ||||
| unsigned int compileVertShader() { | ||||
|     unsigned int vertexShader; | ||||
|     vertexShader = glCreateShader(GL_VERTEX_SHADER); | ||||
|     glShaderSource(vertexShader, 1, &vertSrc, NULL); | ||||
|     glCompileShader(vertexShader); | ||||
|     checkShader(vertexShader, GL_COMPILE_STATUS, "Vertex Shader"); | ||||
|     return vertexShader; | ||||
| } | ||||
| 
 | ||||
| const char* fragSrc = | ||||
|     "#version 330 core\n" | ||||
|     "out vec4 FragColor;\n" | ||||
|     "\n" | ||||
|     "void main()\n" | ||||
|     "{\n" | ||||
|     "    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" | ||||
|     "}\n"; | ||||
| 
 | ||||
| unsigned int compileFragShader() { | ||||
|     unsigned int fragmentShader; | ||||
|     fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); | ||||
|     glShaderSource(fragmentShader, 1, &fragSrc, NULL); | ||||
|     glCompileShader(fragmentShader); | ||||
|     checkShader(fragmentShader, GL_COMPILE_STATUS, "Fragment Shader"); | ||||
|     return fragmentShader; | ||||
| } | ||||
| 
 | ||||
| int main(void) { | ||||
|     glfwInit(); | ||||
| 
 | ||||
|     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||||
|     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | ||||
|     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | ||||
| 
 | ||||
|     GLFWwindow* window = | ||||
|         checkPtr(glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Learn OpenGL", NULL, NULL), | ||||
|                  "Error creating GLFW window"); | ||||
|     if (window == NULL) glfwTerminate(); | ||||
| 
 | ||||
|     glfwMakeContextCurrent(window); | ||||
| 
 | ||||
|     checkCode(gladLoadGLLoader((GLADloadproc)glfwGetProcAddress), "Error initializing GLAD"); | ||||
| 
 | ||||
|     glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); | ||||
| 
 | ||||
|     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); | ||||
| 
 | ||||
|     unsigned int vertexShader = compileVertShader(); | ||||
|     unsigned int fragmentShader = compileFragShader(); | ||||
|     unsigned int shaderProgram = glCreateProgram(); | ||||
|     glAttachShader(shaderProgram, vertexShader); | ||||
|     glAttachShader(shaderProgram, fragmentShader); | ||||
|     glLinkProgram(shaderProgram); | ||||
|     checkShader(vertexShader, GL_LINK_STATUS, "Shader Program"); | ||||
| 
 | ||||
|     glDeleteShader(vertexShader); | ||||
|     glDeleteShader(fragmentShader); | ||||
| 
 | ||||
|     float vertices[] = { | ||||
|         -0.5f, -0.5f, 0.0f, | ||||
|         0.5f, -0.5f, 0.0f, | ||||
|         0.0f,  0.5f, 0.0f | ||||
|     }; | ||||
| 
 | ||||
|     unsigned int VBO, VAO; | ||||
|     glGenVertexArrays(1, &VAO); | ||||
|     glGenBuffers(1, &VBO); | ||||
|     glBindVertexArray(VAO); | ||||
|     glBindBuffer(GL_ARRAY_BUFFER, VBO); | ||||
|     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); | ||||
|     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); | ||||
|     glEnableVertexAttribArray(0); | ||||
| 
 | ||||
|     glBindBuffer(GL_ARRAY_BUFFER, 0); | ||||
|     glBindVertexArray(0); | ||||
| 
 | ||||
|     while (!glfwWindowShouldClose(window)) { | ||||
|         processInput(window); | ||||
| 
 | ||||
|         glClearColor(0.2f, 0.3f, 0.3f, 1.0f); | ||||
|         glClear(GL_COLOR_BUFFER_BIT); | ||||
| 
 | ||||
| 
 | ||||
|         glUseProgram(shaderProgram); | ||||
|         glBindVertexArray(VAO); | ||||
|         glDrawArrays(GL_TRIANGLES, 0, 3); | ||||
| 
 | ||||
|         glfwSwapBuffers(window); | ||||
|         glfwPollEvents(); | ||||
|     } | ||||
| 
 | ||||
|     glDeleteVertexArrays(1, &VAO); | ||||
|     glDeleteBuffers(1, &VBO); | ||||
|     glDeleteProgram(shaderProgram); | ||||
|     glfwTerminate(); | ||||
|     return 0; | ||||
| } | ||||