Convert gl.c to c++ and make it nicer.
This commit is contained in:
parent
4d4582831c
commit
e98856a874
8 changed files with 181 additions and 93 deletions
4
.clang-format
Normal file
4
.clang-format
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
BasedOnStyle: Google
|
||||||
|
UseTab: Always
|
||||||
|
IndentWidth: 4
|
||||||
|
TabWidth: 4
|
4
.clangd
Normal file
4
.clangd
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
Diagnostics:
|
||||||
|
Suppress: [pp_file_not_found]
|
||||||
|
CompileFlags:
|
||||||
|
Add: [-D_arch_dreamcast, -std=c++20]
|
33
.vscode/launch.json
vendored
Normal file
33
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "(gdb) Launch gl.elf",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/gl.elf",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"environment": [],
|
||||||
|
"externalConsole": false,
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"miDebuggerPath": "/opt/toolchains/dc/sh-elf/bin/sh-elf-gdb",
|
||||||
|
"miDebuggerServerAddress": "localhost:3263",
|
||||||
|
"debugServerPath": "/usr/bin/flycast",
|
||||||
|
"debugServerArgs": "${workspaceFolder}/build/gl.elf",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Set SuperH architechture",
|
||||||
|
"text": "set architecture sh4"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"avoidWindowsConsoleRedirection": false,
|
||||||
|
"internalConsoleOptions": "openOnSessionStart"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
|
@ -19,5 +19,8 @@
|
||||||
"args": ["--init-file", "${workspaceFolder}/.vscode/kos_environ.sh" ],
|
"args": ["--init-file", "${workspaceFolder}/.vscode/kos_environ.sh" ],
|
||||||
"overrideName": true
|
"overrideName": true
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"clangd.arguments": [
|
||||||
|
"--query-driver=\"/opt/toolchains/dc/kos/utils/gnu_wrappers/kos-cc,kos-cc\""
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
[binaries]
|
[binaries]
|
||||||
c = 'kos-cc'
|
c = '/opt/toolchains/dc/kos/utils/gnu_wrappers/kos-cc'
|
||||||
cpp = 'kos-c++'
|
cpp = '/opt/toolchains/dc/kos/utils/gnu_wrappers/kos-c++'
|
||||||
ar = 'kos-ar'
|
ar = '/opt/toolchains/dc/kos/utils/gnu_wrappers/kos-ar'
|
||||||
strip = 'kos-strip'
|
strip = '/opt/toolchains/dc/kos/utils/gnu_wrappers/kos-strip'
|
||||||
|
|
||||||
[properties]
|
[properties]
|
||||||
sizeof_int = 4
|
sizeof_int = 4
|
||||||
|
@ -17,7 +17,7 @@ has_function_printf = true
|
||||||
sys_root = '/opt/toolchains/dc/sh-elf/'
|
sys_root = '/opt/toolchains/dc/sh-elf/'
|
||||||
|
|
||||||
[built-in options]
|
[built-in options]
|
||||||
c_args = ['-D_arch_dreamcast', '-D_arch_sub_pristine', '-ml', '-m4-single-only', '-ffunction-sections', '-fdata-sections', '-s', '-fno-builtin', '-fno-stack-protector' ]
|
c_args = ['-D_arch_dreamcast', '-D_arch_sub_pristine', '-ml', '-m4-single-only', '-ffunction-sections', '-fdata-sections', '-s', '-fno-builtin', '-fno-stack-protector']
|
||||||
|
|
||||||
[host_machine]
|
[host_machine]
|
||||||
system = 'dreamcast'
|
system = 'dreamcast'
|
||||||
|
|
85
gl.c
85
gl.c
|
@ -1,85 +0,0 @@
|
||||||
#include <kos.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <GL/gl.h>
|
|
||||||
#include <GL/glu.h>
|
|
||||||
#include <GL/glkos.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
float angle = 0;
|
|
||||||
float deltaTime = 1.0/60.0;
|
|
||||||
const float microSecond = 0.000001f;
|
|
||||||
float speed = 5.0f;
|
|
||||||
|
|
||||||
void initScreen() {
|
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
glLoadIdentity();
|
|
||||||
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayStuff() {
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glRotatef(angle, 0, 0, 1);
|
|
||||||
glColor3f(1.0f, 1.0f, 1.0f);
|
|
||||||
glBegin(GL_POLYGON);
|
|
||||||
glVertex3f(0.25f, 0.25f, 0.0f);
|
|
||||||
glVertex3f(0.75f, 0.25f, 0.0f);
|
|
||||||
glVertex3f(0.75f, 0.75f, 0.0f);
|
|
||||||
glVertex3f(0.25f, 0.75f, 0.0f);
|
|
||||||
glEnd();
|
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
// glFlush();
|
|
||||||
glKosSwapBuffers();
|
|
||||||
}
|
|
||||||
|
|
||||||
void process_input() {
|
|
||||||
maple_device_t *controller;
|
|
||||||
cont_state_t *controller_state;
|
|
||||||
|
|
||||||
controller = maple_enum_type(0, MAPLE_FUNC_CONTROLLER);
|
|
||||||
|
|
||||||
if (controller) {
|
|
||||||
controller_state = (cont_state_t *)maple_dev_status(controller);
|
|
||||||
|
|
||||||
if (!controller_state) {
|
|
||||||
printf("An error has occured while trying to read the controller.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (controller_state->buttons & CONT_DPAD_RIGHT) {
|
|
||||||
speed += 1.0f;
|
|
||||||
} else if (controller_state->buttons & CONT_DPAD_LEFT) {
|
|
||||||
speed -= 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (speed < 1.0f) {
|
|
||||||
speed = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
angle += (controller_state->joyx / 127.0f) * deltaTime * speed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
glKosInit();
|
|
||||||
initScreen();
|
|
||||||
printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR));
|
|
||||||
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
|
|
||||||
printf("GL_VERSION: %s\n", glGetString(GL_VERSION));
|
|
||||||
printf("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS));
|
|
||||||
struct timeval beginningOfFrame, endOfFrame;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
gettimeofday(&beginningOfFrame, 0);
|
|
||||||
process_input();
|
|
||||||
displayStuff();
|
|
||||||
gettimeofday(&endOfFrame, 0);
|
|
||||||
float time = ((float)(endOfFrame.tv_usec) * microSecond) - ((float)(beginningOfFrame.tv_usec) * microSecond);
|
|
||||||
if (time > 0.0f) {
|
|
||||||
deltaTime = time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
129
gl.cc
Normal file
129
gl.cc
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glkos.h>
|
||||||
|
#include <kos.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
const float microSecond = 0.000001f;
|
||||||
|
|
||||||
|
float angle = 0;
|
||||||
|
float deltaTime = 1.0 / 60.0;
|
||||||
|
float speed = 5.0f;
|
||||||
|
|
||||||
|
bool thirtyfps;
|
||||||
|
uint32 buttonsPressed;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void pressButton(cont_state_t* controller_state, int button, T&& callback) {
|
||||||
|
if (controller_state->buttons & button) {
|
||||||
|
if (!(buttonsPressed & button)) {
|
||||||
|
buttonsPressed |= button;
|
||||||
|
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
} else if ((buttonsPressed & button) &&
|
||||||
|
~(controller_state->buttons & button)) {
|
||||||
|
buttonsPressed &= ~button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initScreen() {
|
||||||
|
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayStuff() {
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(angle, 0, 0, 1);
|
||||||
|
glColor3f(0.5f, 0.0f, 1.0f);
|
||||||
|
glBegin(GL_POLYGON);
|
||||||
|
glColor3f(1.0f, 0.0f, 0.0f);
|
||||||
|
glVertex3f(0.25f, 0.25f, 0.0f);
|
||||||
|
|
||||||
|
glColor3f(0.0f, 1.0f, 0.0f);
|
||||||
|
glVertex3f(0.75f, 0.25f, 0.0f);
|
||||||
|
|
||||||
|
glColor3f(0.0f, 0.0f, 1.0f);
|
||||||
|
glVertex3f(0.75f, 0.75f, 0.0f);
|
||||||
|
|
||||||
|
glColor3f(1.0f, 1.0f, 1.0f);
|
||||||
|
glVertex3f(0.25f, 0.75f, 0.0f);
|
||||||
|
glEnd();
|
||||||
|
glPopMatrix();
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
if (thirtyfps) {
|
||||||
|
vid_waitvbl();
|
||||||
|
vid_waitvbl();
|
||||||
|
}
|
||||||
|
|
||||||
|
glKosSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void process_input() {
|
||||||
|
maple_device_t* controller;
|
||||||
|
cont_state_t* controller_state;
|
||||||
|
|
||||||
|
controller = maple_enum_type(0, MAPLE_FUNC_CONTROLLER);
|
||||||
|
|
||||||
|
if (controller) {
|
||||||
|
controller_state = (cont_state_t*)maple_dev_status(controller);
|
||||||
|
|
||||||
|
if (!controller_state) {
|
||||||
|
printf(
|
||||||
|
"An error has occured while trying to read the controller.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
pressButton(controller_state, CONT_DPAD_LEFT, []() { speed -= 1.0f; });
|
||||||
|
pressButton(controller_state, CONT_DPAD_RIGHT, []() { speed += 1.0f; });
|
||||||
|
pressButton(controller_state, CONT_A, []() { thirtyfps = !thirtyfps; });
|
||||||
|
|
||||||
|
speed = std::clamp(speed, 1.0f, 10.0f);
|
||||||
|
|
||||||
|
angle += (controller_state->joyx / 127.0f) * deltaTime * speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printSystemInformation() {
|
||||||
|
printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR));
|
||||||
|
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
|
||||||
|
printf("GL_VERSION: %s\n", glGetString(GL_VERSION));
|
||||||
|
printf("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void deltaTimeLoop(T&& callback, struct timeval& beginningOfFrame,
|
||||||
|
struct timeval& endOfFrame) {
|
||||||
|
gettimeofday(&beginningOfFrame, 0);
|
||||||
|
callback();
|
||||||
|
gettimeofday(&endOfFrame, 0);
|
||||||
|
float time = ((float)(endOfFrame.tv_usec) * microSecond) -
|
||||||
|
((float)(beginningOfFrame.tv_usec) * microSecond);
|
||||||
|
if (time > 0.0f) {
|
||||||
|
deltaTime = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void gameLoop() {
|
||||||
|
process_input();
|
||||||
|
displayStuff();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
glKosInit();
|
||||||
|
initScreen();
|
||||||
|
printSystemInformation();
|
||||||
|
struct timeval beginningOfFrame, endOfFrame;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
deltaTimeLoop(gameLoop, beginningOfFrame, endOfFrame);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
project('dreamcast-opengl', 'c')
|
project('dreamcast-opengl', 'c', 'cpp', default_options: ['cpp_std=c++20'])
|
||||||
|
|
||||||
cc = meson.get_compiler('c')
|
cc = meson.get_compiler('c')
|
||||||
|
|
||||||
|
@ -25,4 +25,4 @@ incdirs = [
|
||||||
]
|
]
|
||||||
|
|
||||||
executable('hello.elf', ['hello.c'], dependencies: deps, include_directories: incdirs)
|
executable('hello.elf', ['hello.c'], dependencies: deps, include_directories: incdirs)
|
||||||
executable('gl.elf', ['gl.c'], dependencies: deps, include_directories: incdirs)
|
executable('gl.elf', ['gl.cc'], dependencies: deps, include_directories: incdirs)
|
||||||
|
|
Loading…
Reference in a new issue