Added input manager and license.
This commit is contained in:
@ -1,3 +1,8 @@
|
||||
# Copyright (c) 2021 Dominic Msters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
#################################### CMAKE #####################################
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Dominic Msters
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
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 Software.
|
||||
|
||||
THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,3 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "render.h"
|
||||
|
||||
render_t *RENDER_CURRENT = NULL;
|
||||
|
@ -1,3 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
@ -32,8 +39,6 @@ extern render_t *RENDER_CURRENT;
|
||||
/**
|
||||
* Initialize the renderer.
|
||||
*
|
||||
* @param width Width (in pixels) of the window.
|
||||
* @param height Height (in pixels) of the window.
|
||||
* @param name String of the windows' name.
|
||||
* @return Rendering Context information.
|
||||
*/
|
||||
|
@ -1,3 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "shader.h"
|
||||
|
||||
shader_t * shaderCompile(char *vertexShaderSource, char* fragmentShaderSource) {
|
||||
|
@ -1,4 +1,12 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <glad/glad.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
47
src/engine/engine.c
Normal file
47
src/engine/engine.c
Normal file
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "engine.h"
|
||||
|
||||
engine_t * engineInit(char *gameName) {
|
||||
// Create the engine instance.
|
||||
engine_t *engine = malloc(sizeof(engine_t));
|
||||
if(engine == NULL) return NULL;
|
||||
|
||||
// Setup the renderer.
|
||||
engine->render = renderInit(gameName);
|
||||
if(engine->render == NULL) {
|
||||
free(engine);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Setup the input manager.
|
||||
engine->input = inputInit(0);
|
||||
if(engine->input == NULL) {
|
||||
free(engine->render);
|
||||
free(engine);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return engine;
|
||||
}
|
||||
|
||||
void engineStart(engine_t *engine) {
|
||||
while(!glfwWindowShouldClose(engine->render->window)) {
|
||||
inputUpdate(engine->input);
|
||||
renderFrame(engine->render);
|
||||
glfwSwapBuffers(engine->render->window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
}
|
||||
|
||||
bool engineDispose(engine_t *engine) {
|
||||
if(!renderDispose(engine->render)) return false;
|
||||
free(engine);
|
||||
|
||||
return true;
|
||||
}
|
46
src/engine/engine.h
Normal file
46
src/engine/engine.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2021 Dominic Msters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include <stdbool.h>
|
||||
#include "../display/render.h"
|
||||
#include "../file/asset.h"
|
||||
#include "../input/input.h"
|
||||
|
||||
/** Information about the current engine context. */
|
||||
typedef struct {
|
||||
/** Name of the game running. */
|
||||
char *gameName;
|
||||
|
||||
/** Renderer for the engine. */
|
||||
render_t *render;
|
||||
|
||||
/** Input Manager for the engine. */
|
||||
input_t *input;
|
||||
} engine_t;
|
||||
|
||||
/**
|
||||
* Initialize the engine context.
|
||||
*
|
||||
* @param gameName Name of the game being initialized.
|
||||
* @return The engine context.
|
||||
*/
|
||||
engine_t * engineInit(char *gameName);
|
||||
|
||||
/**
|
||||
* Start the main engine loop.
|
||||
*
|
||||
* @param engine The game to start the loop for.
|
||||
*/
|
||||
void engineStart(engine_t *engine);
|
||||
|
||||
/**
|
||||
* Cleanup a previously constructed game engine instance.
|
||||
*
|
||||
* @param engine The engine to cleanup.
|
||||
* @return True if successful or not.
|
||||
*/
|
||||
bool engineDispose(engine_t *engine);
|
||||
|
@ -1,3 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "asset.h"
|
||||
|
||||
char * assetStringLoad(char *assetName) {
|
||||
|
@ -1,3 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
@ -1,40 +1,39 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "game.h"
|
||||
|
||||
game_t * gameInit(char *gameName) {
|
||||
// Create the game instance
|
||||
game_t *game = malloc(sizeof(game_t));
|
||||
if(game == NULL) return NULL;
|
||||
typedef struct {
|
||||
engine_t *engine;
|
||||
} dawngame_t;
|
||||
|
||||
// Setup the renderer
|
||||
game->render = renderInit(gameName);
|
||||
if(game->render == NULL) {
|
||||
free(game);
|
||||
game_t * gameInit(char *gameName) {
|
||||
// Create the game
|
||||
dawngame_t *dawn = malloc(sizeof(dawngame_t));
|
||||
if(dawn == NULL) return NULL;
|
||||
|
||||
// Load the game engine
|
||||
dawn->engine = engineInit("Dawn Game");
|
||||
if(dawn->engine == NULL) {
|
||||
free(dawn);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Load a shader
|
||||
shader_t *shader = assetShaderLoad("shaders/test.vert", "shaders/test.frag");
|
||||
if(shader == NULL) {
|
||||
printf("Shader loading failed\n");
|
||||
} else {
|
||||
printf("Shader loaded!\n");
|
||||
}
|
||||
|
||||
return game;
|
||||
// Pass to the main game to handle.
|
||||
return (game_t *)dawn;
|
||||
}
|
||||
|
||||
void gameStart(game_t *game) {
|
||||
while(!glfwWindowShouldClose(game->render->window)) {
|
||||
renderFrame(game->render);
|
||||
|
||||
glfwSwapBuffers(game->render->window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
dawngame_t *dawn = (dawngame_t *)game;
|
||||
engineStart(dawn->engine);
|
||||
}
|
||||
|
||||
bool gameDispose(game_t *game) {
|
||||
if(!renderDispose(game->render)) return false;
|
||||
free(game);
|
||||
|
||||
return true;
|
||||
void gameDispose(game_t *game) {
|
||||
dawngame_t *dawn = (dawngame_t *)game;
|
||||
engineDispose(dawn->engine);
|
||||
free(dawn);
|
||||
}
|
@ -1,21 +1,22 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <stdbool.h>
|
||||
#include "../display/render.h"
|
||||
#include "../file/asset.h"
|
||||
#include "../engine/engine.h"
|
||||
|
||||
/** Information about the current game context. */
|
||||
typedef struct {
|
||||
/** Renderer for the game */
|
||||
render_t *render;
|
||||
} game_t;
|
||||
typedef void game_t;
|
||||
|
||||
/**
|
||||
* Initialize the game context.
|
||||
*
|
||||
* @param gameName Name of the game being initialized.
|
||||
* @return The game instance context.
|
||||
*/
|
||||
game_t * gameInit(char *gameName);
|
||||
game_t * gameInit();
|
||||
|
||||
/**
|
||||
* Start the main game loop.
|
||||
@ -26,9 +27,6 @@ void gameStart(game_t *game);
|
||||
|
||||
/**
|
||||
* Cleanup a previously constructed.
|
||||
*
|
||||
* @param game The game to cleanup.
|
||||
* @return True if successful or not.
|
||||
*/
|
||||
bool gameDispose(game_t *game);
|
||||
|
||||
void gameDispose(game_t *game);
|
97
src/input/input.c
Normal file
97
src/input/input.c
Normal file
@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "input.h"
|
||||
|
||||
input_t * inputInit(uint32_t inputBindCount) {
|
||||
input_t *input = malloc(sizeof(input_t));
|
||||
if(!input) return NULL;
|
||||
input->inputBindCount = inputBindCount;
|
||||
|
||||
input->inputsCurrent = malloc(sizeof(float) * inputBindCount);
|
||||
if(input->inputsCurrent == NULL) {
|
||||
free(input);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
input->inputsPrevious = malloc(sizeof(float) * inputBindCount);
|
||||
if(input->inputsPrevious == NULL) {
|
||||
free(input->inputsCurrent);
|
||||
free(input);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
input->inputTime = malloc(sizeof(float) * inputBindCount);
|
||||
if(input->inputTime == NULL) {
|
||||
free(input->inputsPrevious);
|
||||
free(input->inputsCurrent);
|
||||
free(input);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
void inputUpdate(input_t *input) {
|
||||
// Flip the states to save memory.
|
||||
float * currentCurrent = input->inputsCurrent;
|
||||
input->inputsCurrent = input->inputsPrevious;
|
||||
input->inputsPrevious = currentCurrent;
|
||||
}
|
||||
|
||||
void inputDispose(input_t *input) {
|
||||
free(input->inputTime);
|
||||
free(input->inputsPrevious);
|
||||
free(input->inputsCurrent);
|
||||
free(input);
|
||||
}
|
||||
|
||||
inputbindmap_t inputBind(input_t *input, inputbind_t bind,
|
||||
inputsource_t *source
|
||||
) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
float inputGetState(inputbind_t binding, inputsource_t *source) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool inputIsDown(input_t *input, inputbind_t binding) {
|
||||
return input->inputsCurrent[binding] != 0;
|
||||
}
|
||||
|
||||
bool inputIsUp(input_t *input, inputbind_t binding) {
|
||||
return input->inputsCurrent[binding] == 0;
|
||||
}
|
||||
|
||||
bool inputIsPressed(input_t *input, inputbind_t binding) {
|
||||
return (
|
||||
input->inputsPrevious[binding] == 0 &&
|
||||
input->inputsCurrent[binding] != 0
|
||||
);
|
||||
}
|
||||
|
||||
bool inputIsReleased(input_t *input, inputbind_t binding) {
|
||||
return (
|
||||
input->inputsCurrent[binding] == 0 &&
|
||||
input->inputsPrevious[binding] != 0
|
||||
);
|
||||
}
|
||||
|
||||
float inputGetAxis(input_t *input, inputbind_t binding) {
|
||||
return input->inputsCurrent[binding];
|
||||
}
|
||||
|
||||
float inputGetFullAxis(input_t *input, inputbind_t positive,
|
||||
inputbind_t negative
|
||||
) {
|
||||
return input->inputsCurrent[negative] + input->inputsCurrent[positive];
|
||||
}
|
||||
|
||||
float inputGetAccuated(input_t *input, inputbind_t binding) {
|
||||
return input->inputTime[binding];
|
||||
}
|
176
src/input/input.h
Normal file
176
src/input/input.h
Normal file
@ -0,0 +1,176 @@
|
||||
// Copyright (c) 2021 Dominic Msters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <malloc.h>
|
||||
|
||||
/////////////////////////////// Type Definitions ///////////////////////////////
|
||||
/**
|
||||
* Input Source, can be a button or an axis. Currently a void type.
|
||||
*/
|
||||
typedef void inputsource_t;
|
||||
|
||||
/**
|
||||
* Input Bind, a specific action bind reference for the game engine to use.
|
||||
* e.g. "Jump" or "Walk Forward".
|
||||
*/
|
||||
typedef uint8_t inputbind_t;
|
||||
|
||||
/**
|
||||
* Input Bind Map, contains the bound link between an inputsource_t and an
|
||||
* inputbind_t. Bind Maps can be added and removed.
|
||||
*/
|
||||
typedef uint16_t inputbindmap_t;
|
||||
|
||||
/**
|
||||
* Structure for the entire input mapping.
|
||||
*/
|
||||
typedef struct {
|
||||
/** How many input bindings are in the input managers' scope */
|
||||
uint32_t inputBindCount;
|
||||
|
||||
/** Float of the input between 0 and 1. For teh current frame */
|
||||
float *inputsCurrent;
|
||||
|
||||
/** Float of the input between 0 and 1. For the last frame */
|
||||
float *inputsPrevious;
|
||||
|
||||
/** Float of the GameTime that the input was actuated last. */
|
||||
float *inputTime;
|
||||
|
||||
/**
|
||||
* Array of pointers to all of the input sources. This must be set up by the
|
||||
* platform to register each known input to poll on. Essentially the engine is
|
||||
* going to query the platform for the current state of each input based on the
|
||||
* entries within this list.
|
||||
*/
|
||||
inputsource_t **bindingSources;
|
||||
|
||||
/**
|
||||
* Array of input bindings. This is the list of "possible actions" that the
|
||||
* user can perform. This would contain "jump", "walk forward", "run"... etc.
|
||||
*/
|
||||
inputbind_t *INPUT_BINDING_BINDS;
|
||||
} input_t;
|
||||
//////////////////////////////////// Methods ///////////////////////////////////
|
||||
|
||||
/**
|
||||
* Initializes the input manager.
|
||||
*
|
||||
* @param inputCount The input binding counts to allow for.
|
||||
* @return The input manager
|
||||
*/
|
||||
input_t * inputInit(uint32_t inputBindCount);
|
||||
|
||||
/**
|
||||
* Tick the input manager.
|
||||
* @param input The input to update.
|
||||
*/
|
||||
void inputUpdate(input_t *input);
|
||||
|
||||
/**
|
||||
* Destroy the input manager and cleanup.
|
||||
* @param input The input to destroy.
|
||||
*/
|
||||
void inputDispose(input_t *input);
|
||||
|
||||
/**
|
||||
* Binds the given input binding to the input source. Essentially allowing any
|
||||
* time we fetch the state of bind, we will read the value from source.
|
||||
*
|
||||
* @param input The input manager to bind for.
|
||||
* @param bind The binding to bind against
|
||||
* @param source The source that is being bound.
|
||||
* @return The map between the bind and the source, needed to unbind later.
|
||||
*/
|
||||
inputbindmap_t inputBind(input_t *input, inputbind_t bind,
|
||||
inputsource_t *source
|
||||
);
|
||||
|
||||
/**
|
||||
* Platform-centric method. Method will be polled for each known input source to
|
||||
* request the current state from the device. Values returned will be defined
|
||||
* within the 0 to 1 range.
|
||||
*
|
||||
* @param binding The binding that has been created.
|
||||
* @param source The input source, this was created when the binding was defined
|
||||
* @return Input state between 0 and 1.
|
||||
*/
|
||||
float inputGetState(inputbind_t binding, inputsource_t *source);
|
||||
|
||||
/**
|
||||
* Is the current input "down", not being pressed, being moved, not in a state
|
||||
* of rest.
|
||||
*
|
||||
* @param state The input state to check against.
|
||||
* @param binding The previously bound input binding.
|
||||
* @return True if the input vector is non-zero.
|
||||
*/
|
||||
bool inputIsDown(input_t *state, inputbind_t binding);
|
||||
|
||||
/**
|
||||
* Is the current input "up", in a state of rest, not being actioned, moved.
|
||||
*
|
||||
* @param state The input state to check against.
|
||||
* @param binding The previously bound input binding.
|
||||
* @return True if input vector is zero
|
||||
*/
|
||||
bool inputIsUp(input_t *state, inputbind_t binding);
|
||||
|
||||
/**
|
||||
* Returns true on the first tick that an input was actioned/downed.
|
||||
*
|
||||
* @param input The input manager.
|
||||
* @param binding The previously bound input binding.
|
||||
* @return True if the input vector was non-zeroed this tick but not last.
|
||||
*/
|
||||
bool inputIsPressed(input_t *input, inputbind_t binding);
|
||||
|
||||
/**
|
||||
* Returns true on the first tick that an input was released/upped.
|
||||
*
|
||||
* @param input The input manager.
|
||||
* @param binding The previously bound input binding.
|
||||
* @return True if the input vector was zeroed this tick but not last.
|
||||
*/
|
||||
bool inputIsReleased(input_t *input, inputbind_t binding);
|
||||
|
||||
/**
|
||||
* Returns the raw input value as a float between 0 and 1. For digital (buttons)
|
||||
* this will typicall be 0 or 1 only. Other analogue inputs will have anywhere
|
||||
* within the range.
|
||||
*
|
||||
* @param input The input manager to check against.
|
||||
* @param binding The previously bound input binding.
|
||||
* @return A float between 0 and 1 representing the action force of the input.
|
||||
*/
|
||||
float inputGetAxis(input_t *input, inputbind_t binding);
|
||||
|
||||
/**
|
||||
* Returns a raw input value between -1 and 1 between two axis. This would be
|
||||
* indicitive of having an input with an axis that can be moved one direction
|
||||
* for a positive input and another for a negative input, typically a game
|
||||
* controller's analogue sticks.
|
||||
*
|
||||
* @param input The input manager to check against.
|
||||
* @param postitive The positive axis binding.
|
||||
* @param negative The negative axis binding.
|
||||
* @return A float between -1 and 1 representing the result of both.
|
||||
*/
|
||||
float inputGetFullAxis(input_t *input, inputbind_t positive,
|
||||
inputbind_t negative
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the time that an input was actuated at. Actuate would count as a
|
||||
* non-zero input for analogue inputs.
|
||||
*
|
||||
* @param input The input manager to check against.
|
||||
* @param binding The previously bound input binding.
|
||||
* @return Game Engine time that an input was non-zeroed
|
||||
*/
|
||||
float inputGetAccuated(input_t *input, inputbind_t binding);
|
13
src/main.c
13
src/main.c
@ -1,17 +1,22 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "main.h"
|
||||
|
||||
int32_t main() {
|
||||
// Create the game instance
|
||||
game_t *game = gameInit("Dawn");
|
||||
game_t *game = gameInit();
|
||||
if(game == NULL) return 1;
|
||||
|
||||
// Start running the game instance
|
||||
gameStart(game);
|
||||
|
||||
// Game has finished running, cleanup.
|
||||
if(!gameDispose(game)) {
|
||||
return 1;
|
||||
}
|
||||
gameDispose(game);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,3 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) 2021 Dominic Msters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
|
||||
|
Reference in New Issue
Block a user