taisei/src/renderer/common/matstack.h
2024-05-17 14:11:48 +02:00

64 lines
1.5 KiB
C

/*
* This software is licensed under the terms of the MIT License.
* See COPYING for further information.
* ---
* Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
*/
#pragma once
#include "taisei.h"
#include "util/glm.h"
enum {
MATSTACK_LIMIT = 32,
};
typedef struct MatrixStack {
mat4 *head;
// the alignment is required for the SSE codepath in CGLM
mat4 stack[MATSTACK_LIMIT] CGLM_ALIGN(32);
} MatrixStack;
// Resets [ms] to its initial state, with a single indentity matrix.
// Must be called at least once before the stack can be used.
void matstack_reset(MatrixStack *ms)
attr_nonnull(1);
// Pushes a new matrix onto [ms], updates [ms]->head.
// It's initialized to a copy of the previous head.
void matstack_push(MatrixStack *ms)
attr_nonnull(1);
// Pushes a new matrix onto [ms], updates [ms]->head.
// [mat] is copied into the new [ms]->head.
void matstack_push_premade(MatrixStack *ms, mat4 mat)
attr_nonnull(1, 2);
// Pushes a new matrix onto [ms], updates [ms]->head.
// It's initialized to the identity matrix.
void matstack_push_identity(MatrixStack *ms)
attr_nonnull(1);
// Pops a matrix from [ms], updates [ms]->head.
// It's an error to pop the last element.
void matstack_pop(MatrixStack *ms)
attr_nonnull(1);
typedef struct MatrixStates {
union {
struct {
MatrixStack modelview;
MatrixStack projection;
MatrixStack texture;
};
MatrixStack indexed[3];
};
} MatrixStates;
extern MatrixStates _r_matrices;
void _r_mat_init(void);