shithub: tinygl

Download patch

ref: 8d8347fe5177137b0ff4aedbdf058928d15bf403
parent: a271c0d5cf1ae8781ae8d35179da9ea56359d7d5
author: David <gek@katherine>
date: Wed Feb 17 14:30:45 EST 2021

Added new project- menu

--- a/SDL_Examples/Makefile
+++ b/SDL_Examples/Makefile
@@ -10,8 +10,11 @@
 all: $(ALL_T)
 clean:
 	rm -f $(ALL_T) *.exe
+	rm -f menu
 texture:
 	gcc texture.c $(LIB) -o texture $(GL_INCLUDES) $(SDL_LIBS) $(SDL_MIXERLIBS) $(GL_LIBS) $(CFLAGS) -lm
+menu:
+	gcc menu.c $(LIB) -o menu $(GL_INCLUDES) $(SDL_LIBS) $(SDL_MIXERLIBS) $(GL_LIBS) $(CFLAGS) -lm
 helloworld:
 	gcc helloworld.c $(LIB) -o helloworld $(GL_INCLUDES) $(GL_LIBS) $(CFLAGS) $(SDL_LIBS) $(SDL_MIXERLIBS) -lm
 model:
--- /dev/null
+++ b/SDL_Examples/menu.c
@@ -1,0 +1,351 @@
+/* sdlGears.c */
+/*
+ * 3-D gear wheels by Brian Paul. This program is in the public domain.
+ *
+ * ported to libSDL/TinyGL by Gerald Franz (gfz@o2online.de)
+ */
+//#define PLAY_MUSIC
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../include/GL/gl.h"
+
+#include "../include/zbuffer.h"
+#define CHAD_API_IMPL
+#define CHAD_MATH_IMPL
+#include "include/3dMath.h"
+#ifdef PLAY_MUSIC
+#include "include/api_audio.h"
+#else
+typedef unsigned char uchar;
+#endif
+#define STB_IMAGE_IMPLEMENTATION
+#include "include/stb_image.h"
+#include <SDL/SDL.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+GLuint tex = 0;
+int winSizeX = 640;
+int winSizeY = 480;
+double tpassed = 0;
+
+GLuint loadRGBTexture(unsigned char* buf, unsigned int w, unsigned int h) {
+	GLuint t = 0;
+	glGenTextures(1, &t);
+	// for(unsigned int i = 0; i < w * h; i++)
+	// {
+	// unsigned char t = 0;
+	// unsigned char* r = buf + i*3;
+	// // unsigned char* g = buf + i*3+1;
+	// unsigned char* b = buf + i*3+2;
+	// t = *r;
+	// *r = *b;
+	// *b = t;
+	// }
+	glBindTexture(GL_TEXTURE_2D, t);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, buf);
+	return t;
+}
+
+void drawBox(GLfloat x, GLfloat y, GLfloat xdim, GLfloat ydim){ //0,0 is top left, 1,1 is bottom right
+	x*=2;xdim*=2;
+	y*=2;ydim*=2;
+	glBegin(GL_TRIANGLES);
+	// TRIANGLE 1,
+	glTexCoord2f(0, 0); 
+	glVertex3f(-1+x, 1-y-ydim, 0.5); //Bottom Left Corner
+
+	glTexCoord2f(1, -1);
+	glVertex3f(-1+x+xdim, 1-y , 0.5); //Top Right Corner
+
+	glTexCoord2f(0, -1);
+	glVertex3f(-1+x, 1-y, 0.5); //Top Left
+	// TRIANGLE 2
+	glTexCoord2f(0, 0);
+	glVertex3f(-1+x, 1-y-ydim, 0.5); //Bottom Left Corner
+
+	glTexCoord2f(1, 0);
+	glVertex3f(-1+x+xdim, 1-y-ydim, 0.5);
+
+	glTexCoord2f(1, -1);
+	glVertex3f(-1+x+xdim, 1-y , 0.5); //Top Right Corner
+	glEnd();
+}
+
+void drawTB(const char* text, GLuint textcolor, GLfloat x, GLfloat y, GLint size){
+	size = (size>64)?64:((size<8)?8:size); 
+	size >>= 3; //divide by 8 to get the GLTEXTSIZE
+	if(!size || !text) return;
+	int mw = 0, h = 1, cw = 0; //max width, height, current width
+	for(int i = 0; text[i] != '\0' && (text[i] & 127);i++){
+		if(text[i] != '\n') 
+			cw++; 
+		else 
+			{cw = 0; h++;}
+		if(mw<cw)mw=cw;
+	}
+	float w = (size+1)*8*(mw) / (float)winSizeX;
+	float h_ = (size+1)*8*(h)/(float)winSizeY;
+	drawBox(x-w/8,y-h_/8, w, h_);
+	glTextSize(size);
+	glDrawText((unsigned char*)text, x*winSizeX, y*winSizeY, textcolor);
+}
+
+void draw() {
+	glEnable(GL_TEXTURE_2D);
+	glBindTexture(GL_TEXTURE_2D, tex);
+	glBegin(GL_TRIANGLES);
+	// TRIANGLE 1,
+	glTexCoord2f(0, 0);
+	glVertex3f(-1, -1, 0.5);
+
+	glTexCoord2f(1, -1);
+	glVertex3f(1, 1, 0.5);
+
+	glTexCoord2f(0, -1);
+	glVertex3f(-1, 1, 0.5);
+	// TRIANGLE 2
+	glTexCoord2f(0, 0);
+	glVertex3f(-1, -1, 0.5);
+
+	glTexCoord2f(1, 0);
+	glVertex3f(1, -1, 0.5);
+
+	glTexCoord2f(1, -1);
+	glVertex3f(1, 1, 0.5);
+	glEnd();
+	glColor4f(1,1,1,1);
+	//glDisable(GL_TEXTURE_2D);
+	drawBox(0.8,0.8,0.2,0.2);
+	glColor3f(1,1,1);
+	glDisable(GL_TEXTURE_2D);
+	drawTB("I hate text", 0x00, 0.4, 0.4 + 0.1 * sinf(tpassed),24);
+}
+
+void initScene() {
+	static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
+
+	static GLfloat white[4] = {1.0, 1.0, 1.0, 0.0};
+
+	glLightfv(GL_LIGHT0, GL_POSITION, pos);
+	glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
+	// glLightfv( GL_LIGHT0, GL_AMBIENT, white);
+	// glLightfv( GL_LIGHT0, GL_SPECULAR, white);
+	//glEnable(GL_CULL_FACE);
+	glDisable( GL_CULL_FACE );
+	glDisable(GL_BLEND);
+	//glEnable(GL_LIGHTING);
+	glEnable(GL_TEXTURE_2D);
+	glDisable(GL_LIGHTING);
+	// glEnable( GL_LIGHT0 );
+	glDisable(GL_DEPTH_TEST);
+	glDepthMask(GL_FALSE);
+	glShadeModel(GL_SMOOTH);
+	glTextSize(GL_TEXT_SIZE24x24);
+	{
+		int sw = 0, sh = 0, sc = 0; // sc goes unused.
+		uchar* source_data = stbi_load("texture.png", &sw, &sh, &sc, 3);
+		if (source_data) {
+			tex = loadRGBTexture(source_data, sw, sh);
+			free(source_data);
+		} else {
+			printf("\nCan't load texture!\n");
+		}
+	}
+	glEnable(GL_NORMALIZE);
+}
+
+int main(int argc, char** argv) {
+	// initialize SDL video:
+
+	unsigned int fps = 0;
+	char needsRGBAFix = 0;
+	if (argc > 2) {
+		char* larg = argv[1];
+		for (int i = 0; i < argc; i++) {
+			if (!strcmp(larg, "-w"))
+				winSizeX = atoi(argv[i]);
+			if (!strcmp(larg, "-h"))
+				winSizeY = atoi(argv[i]);
+			if (!strcmp(larg, "-fps"))
+				fps = strtoull(argv[i], 0, 10);
+			larg = argv[i];
+		}
+	}
+#ifdef PLAY_MUSIC
+	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
+#else
+	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
+#endif
+		fprintf(stderr, "ERROR: cannot initialize SDL video.\n");
+		return 1;
+	}
+#ifdef PLAY_MUSIC
+	ainit(0);
+#endif
+	SDL_Surface* screen = NULL;
+	if ((screen = SDL_SetVideoMode(winSizeX, winSizeY, TGL_FEATURE_RENDER_BITS, SDL_SWSURFACE)) == 0) {
+		fprintf(stderr, "ERROR: Video mode set failed.\n");
+		return 1;
+	}
+	printf("\nRMASK IS %u", screen->format->Rmask);
+	printf("\nGMASK IS %u", screen->format->Gmask);
+	printf("\nBMASK IS %u", screen->format->Bmask);
+	printf("\nAMASK IS %u", screen->format->Amask);
+#if TGL_FEATURE_RENDER_BITS == 32
+	if (screen->format->Rmask != 0x00FF0000 || screen->format->Gmask != 0x0000FF00 || screen->format->Bmask != 0x000000FF) {
+		needsRGBAFix = 1;
+		printf("\nYour screen is using an RGBA output different than this library expects.");
+		printf("\nYou should consider using the 16 bit version for optimal performance");
+	}
+#endif
+
+	printf("\nRSHIFT IS %u", screen->format->Rshift);
+	printf("\nGSHIFT IS %u", screen->format->Gshift);
+	printf("\nBSHIFT IS %u", screen->format->Bshift);
+	printf("\nASHIFT IS %u\n", screen->format->Ashift);
+	fflush(stdout);
+	
+#ifdef PLAY_MUSIC
+	track* myTrack = NULL;
+	myTrack = lmus("WWGW.mp3");
+	mplay(myTrack, -1, 1000);
+#endif
+	SDL_ShowCursor(SDL_ENABLE);
+	SDL_WM_SetCaption(argv[0], 0);
+
+	// initialize TinyGL:
+
+	int mode;
+	switch (screen->format->BitsPerPixel) {
+	case 16:
+
+		// fprintf(stderr,"\nUnsupported by maintainer!!!");
+		mode = ZB_MODE_5R6G5B;
+		// return 1;
+		break;
+	case 32:
+
+		mode = ZB_MODE_RGBA;
+		break;
+	default:
+		return 1;
+		break;
+	}
+	ZBuffer* frameBuffer = ZB_open(winSizeX, winSizeY, mode, 0, 0, 0, 0);
+	glInit(frameBuffer);
+
+	// initialize GL:
+	glClearColor(0.0, 0.0, 0.0, 0.0);
+	glViewport(0, 0, winSizeX, winSizeY);
+	glEnable(GL_DEPTH_TEST);
+	// GLfloat  h = (GLfloat) winSizeY / (GLfloat) winSizeX;
+	glMatrixMode(GL_PROJECTION);
+	glLoadIdentity();
+	// glFrustum( -1.0, 1.0, -h, h, 5.0, 60.0 );
+	glMatrixMode(GL_MODELVIEW);
+	glLoadIdentity();
+	// glTranslatef( 0.0, 0.0, -45.0 );
+
+	initScene();
+
+	// variables for timing:
+	long long unsigned int frames = 0;
+	unsigned int tNow = SDL_GetTicks();
+	unsigned int tLastFps = tNow;
+
+	// main loop:
+	int isRunning = 1;
+	while (isRunning) {
+		++frames;
+		tpassed += frames * 16.666666/1000.0;
+		tNow = SDL_GetTicks();
+		// do event handling:
+		SDL_Event evt;
+		while (SDL_PollEvent(&evt))
+			switch (evt.type) {
+			case SDL_KEYDOWN:
+				switch (evt.key.keysym.sym) {
+					break;
+				case SDLK_ESCAPE:
+				case SDLK_q:
+					isRunning = 0;
+				default:
+					break;
+				}
+				break;
+			case SDL_QUIT:
+				isRunning = 0;
+				break;
+			}
+
+		// draw scene:
+		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+		draw();
+		//glDrawText((unsigned char*)"\nBlitting text\nto the screen!", 0, 0, 0x000000FF);
+		// swap buffers:
+		if (SDL_MUSTLOCK(screen) && (SDL_LockSurface(screen) < 0)) {
+			fprintf(stderr, "SDL ERROR: Can't lock screen: %s\n", SDL_GetError());
+			return 1;
+		}
+		/*
+		printf("\nRMASK IS %u",screen->format->Rmask);
+		printf("\nGMASK IS %u",screen->format->Gmask);
+		printf("\nBMASK IS %u",screen->format->Bmask);
+		printf("\nAMASK IS %u",screen->format->Amask);
+		*/
+		// Quickly convert all pixels to the correct format
+#if TGL_FEATURE_RENDER_BITS == 32
+		if (needsRGBAFix)
+			for (int i = 0; i < frameBuffer->xsize * frameBuffer->ysize; i++) {
+#define DATONE (frameBuffer->pbuf[i])
+				DATONE = ((DATONE & 0x000000FF)) << screen->format->Rshift | ((DATONE & 0x0000FF00) >> 8) << screen->format->Gshift |
+						 ((DATONE & 0x00FF0000) >> 16) << screen->format->Bshift;
+			}
+#endif
+		ZB_copyFrameBuffer(frameBuffer, screen->pixels, screen->pitch);
+		if (SDL_MUSTLOCK(screen))
+			SDL_UnlockSurface(screen);
+		SDL_Flip(screen);
+		if (fps > 0)
+			if ((1000 / fps) > (SDL_GetTicks() - tNow)) {
+				SDL_Delay((1000 / fps) - (SDL_GetTicks() - tNow)); // Yay stable framerate!
+			}
+		// check for error conditions:
+		char* sdl_error = SDL_GetError();
+		if (sdl_error[0] != '\0') {
+			fprintf(stderr, "SDL ERROR: \"%s\"\n", sdl_error);
+			SDL_ClearError();
+		}
+		// update fps:
+		if (tNow >= tLastFps + 5000) {
+			printf("%i frames in %f secs, %f frames per second.\n", frames, (float)(tNow - tLastFps) * 0.001f,
+				   (float)frames * 1000.0f / (float)(tNow - tLastFps));
+			tLastFps = tNow;
+			frames = 0;
+		}
+	}
+	printf("%i frames in %f secs, %f frames per second.\n", frames, (float)(tNow - tLastFps) * 0.001f, (float)frames * 1000.0f / (float)(tNow - tLastFps));
+	// cleanup:
+	ZB_close(frameBuffer);
+	glClose();
+	if (SDL_WasInit(SDL_INIT_VIDEO))
+		SDL_QuitSubSystem(SDL_INIT_VIDEO);
+#ifdef PLAY_MUSIC
+	mhalt();
+	Mix_FreeMusic(myTrack);
+	acleanup();
+#endif
+	SDL_Quit();
+	return 0;
+}