Fixed rotation problems by using kmMath instead of linmath library

dev
Shariq Shah 10 years ago
parent e544138b62
commit f82493181d
  1. 5
      premake4.lua
  2. 26
      src/camera.c
  3. 2
      src/entity.c
  4. 147
      src/game.c
  5. 12
      src/geometry.c
  6. 1330
      src/linmath.h
  7. 10
      src/model.c
  8. 3
      src/model.h
  9. 1
      src/renderer.c
  10. 16
      src/shader.c
  11. 8
      src/shader.h
  12. 138
      src/transform.c
  13. 24
      src/transform.h
  14. 27
      src/utils.c
  15. 10
      src/utils.h

@ -6,6 +6,7 @@ includedirs {"include/**"}
buildoptions {"-Wall", "-std=c11"}
linkoptions { "`pkg-config --libs --static glfw3`" }
links {"GLEW"}
local lib_base = "libs"
-- local cmd_stream = assert(io.popen("pkg-config --libs --static glfw3", r))
-- local libs_to_link = assert(cmd_stream:read("*all"))
@ -20,10 +21,14 @@ files { "src/*.h", "src/*.c"}
configuration "Debug"
flags {"Symbols"}
libdirs {path.join(lib_base, "debug/**")}
links {"kazmath"}
targetdir "bin/debug"
configuration "Release"
defines {"NDEBUG"}
flags {"Optimize"}
libdirs {path.join(lib_base, "release/**")}
links {"kazmath"}
targetdir "bin/release"

@ -58,13 +58,13 @@ int camera_create(int node, int width, int height)
new_camera->node = node;
new_camera->farz = 1000.f;
new_camera->nearz = 0.1f;
new_camera->fov = TO_RADIANS(60.f);
new_camera->fov = 60.f;
float aspect_ratio = (float)width / (float)height;
new_camera->aspect_ratio = aspect_ratio <= 0.f ? (4.f / 3.f) : aspect_ratio;
new_camera->ortho = 0;
mat4_identity(new_camera->view_mat);
mat4_identity(new_camera->proj_mat);
mat4_identity(new_camera->view_proj_mat);
mat4_identity(&new_camera->view_mat);
mat4_identity(&new_camera->proj_mat);
mat4_identity(&new_camera->view_proj_mat);
camera_update_view(new_camera);
camera_update_proj(new_camera);
@ -73,18 +73,20 @@ int camera_create(int node, int width, int height)
void camera_update_view_proj(struct Camera* camera)
{
mat4_mul(camera->view_proj_mat, camera->proj_mat, camera->view_mat);
mat4_mul(&camera->view_proj_mat, &camera->proj_mat, &camera->view_mat);
}
void camera_update_view(struct Camera* camera)
{
struct Entity* entity = entity_get(camera->node);
struct Transform* transform = entity_component_get(entity, C_TRANSFORM);
vec3 lookat = {0.f}, up = {0.f}, position = {0.f};
transform_get_lookat(transform, lookat);
transform_get_up(transform, up);
transform_get_absolute_pos(transform, position);
mat4_look_at(camera->view_mat, position, lookat, up);
vec3 lookat = {0.f, 0.f, 0.f};
vec3 up = {0.f, 0.f, 0.f};
vec3 position = {0.f, 0.f, 0.f};
transform_get_absolute_lookat(transform, &lookat);
transform_get_absolute_up(transform, &up);
transform_get_absolute_pos(transform, &position);
mat4_lookat(&camera->view_mat, &position, &lookat, &up);
camera_update_view_proj(camera);
}
@ -92,7 +94,7 @@ void camera_update_proj(struct Camera* camera)
{
if(!camera->ortho)
{
mat4_perspective(camera->proj_mat,
mat4_perspective(&camera->proj_mat,
camera->fov,
camera->aspect_ratio,
camera->nearz,
@ -100,7 +102,7 @@ void camera_update_proj(struct Camera* camera)
}
else
{
mat4_ortho(camera->proj_mat, -1, 1, -1, 1, camera->nearz, camera->farz);
mat4_ortho(&camera->proj_mat, -1, 1, -1, 1, camera->nearz, camera->farz);
}
camera_update_view_proj(camera);
}

@ -105,7 +105,7 @@ struct Entity* entity_find(const char* name)
for(int i = 0; i < array_len(entity_list); i++)
{
struct Entity* curr_ent = &entity_list[i];
if(!entity->name)
if(!curr_ent->name)
continue;
if(strcmp(curr_ent->name, name) == 0)
{

@ -69,31 +69,53 @@ void game_init(void)
player_node = player->node;
vec3 viewer_pos = {0, 0, 10};
struct Transform* viewer_tran = entity_component_get(player, C_TRANSFORM);
transform_set_position(viewer_tran, viewer_pos);
/* struct Entity* player_pitch = scene_add_as_child("player_pitch", NULL, player); */
/* player_pitch_node = player_pitch->node; */
/* entity_component_add(player_pitch, C_CAMERA, 800, 600); */
struct Camera* camera = entity_component_add(player, C_CAMERA, 800, 600);
transform_set_position(viewer_tran, &viewer_pos);
struct Entity* player_pitch = scene_add_as_child("player_pitch", NULL, player);
player_pitch_node = player_pitch->node;
entity_component_add(player_pitch, C_CAMERA, 800, 600);
/* struct Camera* camera = entity_component_add(player, C_CAMERA, 800, 600); */
struct Entity* new_ent = scene_add_new("Model_Entity", NULL);
struct Transform* tran = entity_component_get(new_ent, C_TRANSFORM);
vec3 position = {0, 0, -5};
transform_translate(tran, position, TS_WORLD);
struct Model* model = entity_component_add(new_ent, C_MODEL, "default.pamesh");
transform_translate(tran, &position, TS_WORLD);
entity_component_add(new_ent, C_MODEL, "default.pamesh");
struct Transform* model_tran = entity_component_get(new_ent, C_TRANSFORM);
//vec3 axis = {0.f, 1.f, 0.f};
//transform_rotate(model_tran, axis, (45.f), TS_WORLD);
vec3 scale = {1, 1, 2};
transform_scale(model_tran, scale);
transform_scale(model_tran, &scale);
struct Entity* suz = scene_add_as_child("Suzanne", NULL, new_ent);
entity_component_add(suz, C_MODEL, "suzanne.pamesh");
struct Transform* s_tran = entity_component_get(suz, C_TRANSFORM);
vec3 s_pos = {3, 0, 0};
transform_translate(s_tran, s_pos, TS_WORLD);
transform_translate(s_tran, &s_pos, TS_WORLD);
/* Set cursor mode */
input_cursor_mode_set(CM_LOCKED);
struct Entity* ground = scene_add_new("Ground", NULL);
struct Model* ground_model = entity_component_add(ground, C_MODEL, "plane.pamesh");
ground_model->color.x = 1.f;
struct Transform* ground_tran = entity_component_get(ground, C_TRANSFORM);
vec3 pos = {0, -3, -3};
vec3 scale_ground = {0.5f, 0.5f, 3.f};
transform_set_position(ground_tran, &pos);
transform_scale(ground_tran, &scale_ground);
mat4 m1, m2, r1, r2, f1, f2;
mat4_identity(&m1);
mat4_identity(&m2);
mat4_identity(&r1);
mat4_identity(&r2);
mat4_identity(&f1);
mat4_identity(&f2);
mat4_rot_x(&m1, TO_RADIANS(25.f));
mat4_rot_x(&m2, TO_RADIANS(25.f));
mat4_rot_x(&f1, TO_RADIANS(5.f));
mat4_rot_x(&f2, TO_RADIANS(5.f));
mat4_mul(&r1, &f1, &m1);
mat4_mul(&r2, &m1, &f1);
run();
}
@ -101,9 +123,9 @@ void game_init(void)
void debug(float dt)
{
struct Entity* entity = entity_get(player_node);
//struct Entity* entity_pitch = entity_get(player_pitch_node);
struct Entity* entity_pitch = entity_get(player_pitch_node);
struct Transform* transform = entity_component_get(entity, C_TRANSFORM);
//struct Transform* pitch_transform = entity_component_get(entity_pitch, C_TRANSFORM);
struct Transform* pitch_transform = entity_component_get(entity_pitch, C_TRANSFORM);
float move_speed = 5.f, turn_speed = 50.f;
vec3 offset = {0, 0, 0};
float turn_up_down = 0.f;
@ -121,16 +143,18 @@ void debug(float dt)
double cursor_lr, cursor_ud;
input_cursor_pos_get(&cursor_lr, &cursor_ud);
input_cursor_pos_set(0.0, 0.0);
if(input_mousebutton_state_get(GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS))
{
const double scale = 0.5;
turn_up_down = cursor_ud * turn_speed * dt * scale;
input_cursor_mode_set(CM_LOCKED);
const double scale = 0.25;
turn_up_down = -cursor_ud * turn_speed * dt * scale;
turn_left_right = cursor_lr * turn_speed * dt * scale;
input_cursor_pos_set(0.0, 0.0);
}
else
{
input_cursor_mode_set(CM_NORMAL);
turn_up_down *= dt;
turn_left_right *= dt;
}
@ -147,52 +171,51 @@ void debug(float dt)
turn_up_down = 0.f;
}
struct Entity* ground = scene_find("Ground");
struct Transform* ground_tran = entity_component_get(ground, C_TRANSFORM);
//transform = ground_tran;
//transform_rotate(ground_tran, rot_axis_left_right, 50.f * dt, TS_WORLD);
if(turn_left_right != 0.f)
{
transform_rotate(transform, rot_axis_left_right, -turn_left_right, TS_WORLD);
vec3 up = {0.f};
vec3 forward = {0.f};
transform_get_up(transform, up);
transform_get_forward(transform, forward);
/* log_message("Up : %.3f, %.3f, %.3f", up[0], up[1], up[2]); */
/* log_message("Forward : %.3f, %.3f, %.3f", forward[0], forward[1], forward[2]); */
/* log_message("ROT : %.3f, %.3f, %.3f", */
/* TO_DEGREES(quat_pitch(transform->rotq)), */
/* TO_DEGREES(quat_yaw(transform->rotq)), */
/* TO_DEGREES(quat_roll(transform->rotq))); */
//transform_rotate(transform, rot_axis_left_right, turn_left_right, TS_WORLD);
transform_rotate(transform, &rot_axis_left_right, -turn_left_right, TS_WORLD);
vec3 up = {0.f, 0.f, 0.f};
vec3 forward = {0.f, 0.f, 0.f};
vec3 lookat = {0.f, 0.f, 0.f};
transform_get_up(transform, &up);
transform_get_forward(transform, &forward);
transform_get_lookat(transform, &lookat);
log_message("Up : %s", tostr_vec3(&up));
log_message("FR : %s", tostr_vec3(&forward));
}
if(turn_up_down != 0.f)
{
transform_rotate(transform, rot_axis_up_down, -turn_up_down, TS_LOCAL);
//transform_rotate(pitch_transform, rot_axis_up_down, -turn_up_down, TS_LOCAL);
/* log_message("ROT : %.3f, %.3f, %.3f", */
/* TO_DEGREES(quat_pitch(pitch_transform->rotq)), */
/* TO_DEGREES(quat_yaw(pitch_transform->rotq)), */
/* TO_DEGREES(quat_roll(pitch_transform->rotq))); */
vec3 up = {0.f};
vec3 forward = {0.f};
transform_get_up(transform, up);
transform_get_forward(transform, forward);
log_message("Up : %s", tostr_vec3(up));
log_message("FR : %s", tostr_vec3(forward));
//transform_rotate(transform, &rot_axis_up_down, turn_up_down, TS_LOCAL);
transform_rotate(pitch_transform, &rot_axis_up_down, turn_up_down, TS_LOCAL);
vec3 up = {0.f, 0.f, 0.f};
vec3 forward = {0.f, 0.f, 0.f};
vec3 lookat = {0.f, 0.f, 0.f};
transform_get_up(transform, &up);
transform_get_forward(transform, &forward);
transform_get_lookat(transform, &lookat);
log_message("Up : %s", tostr_vec3(&up));
log_message("FR : %s", tostr_vec3(&forward));
}
/* Movement */
if(input_map_state_get("Move_Forward", GLFW_PRESS)) offset[2] -= move_speed;
if(input_map_state_get("Move_Backward", GLFW_PRESS)) offset[2] += move_speed;
if(input_map_state_get("Move_Left", GLFW_PRESS)) offset[0] -= move_speed;
if(input_map_state_get("Move_Right", GLFW_PRESS)) offset[0] += move_speed;
if(input_map_state_get("Move_Up", GLFW_PRESS)) offset[1] += move_speed;
if(input_map_state_get("Move_Down", GLFW_PRESS)) offset[1] -= move_speed;
vec3_scale(offset, offset, dt);
if(offset[0] != 0 || offset[2] != 0 || offset[1] != 0)
if(input_map_state_get("Move_Forward", GLFW_PRESS)) offset.z -= move_speed;
if(input_map_state_get("Move_Backward", GLFW_PRESS)) offset.z += move_speed;
if(input_map_state_get("Move_Left", GLFW_PRESS)) offset.x -= move_speed;
if(input_map_state_get("Move_Right", GLFW_PRESS)) offset.x += move_speed;
if(input_map_state_get("Move_Up", GLFW_PRESS)) offset.y += move_speed;
if(input_map_state_get("Move_Down", GLFW_PRESS)) offset.y -= move_speed;
vec3_scale(&offset, &offset, dt);
if(offset.x != 0 || offset.y != 0 || offset.z != 0)
{
transform_translate(transform, offset, TS_LOCAL);
log_message("Position : %.3f, %.3f, %.3f",
transform->position[0],
transform->position[1],
transform->position[2]);
transform_translate(transform, &offset, TS_LOCAL);
log_message("Position : %s", tostr_vec3(&transform->position));
}
if(input_key_state_get(GLFW_KEY_SPACE, GLFW_PRESS))
@ -200,23 +223,27 @@ void debug(float dt)
struct Entity* model = entity_get(2);
struct Transform* mod_tran = entity_component_get(model, C_TRANSFORM);
vec3 x_axis = {1, 0, 0};
transform_rotate(mod_tran, x_axis, 25.f * dt, TS_WORLD);
transform_rotate(mod_tran, &x_axis, 25.f * dt, TS_WORLD);
}
if(input_key_state_get(GLFW_KEY_M, GLFW_PRESS))
{
struct Entity* model = entity_get(3);
struct Entity* model = entity_get(2);
struct Transform* mod_tran = entity_component_get(model, C_TRANSFORM);
vec3 y_axis = {0, 1, 0};
transform_rotate(mod_tran, y_axis, 25.f * dt, TS_LOCAL);
vec3 y_axis = {0, 0, 1};
transform_rotate(mod_tran, &y_axis, 25.f * dt, TS_LOCAL);
}
if(input_key_state_get(GLFW_KEY_N, GLFW_PRESS))
{
struct Entity* model = entity_get(3);
/* struct Entity* model = entity_get(3); */
/* struct Transform* mod_tran = entity_component_get(model, C_TRANSFORM); */
/* vec3 amount = {0, 0, -5 * dt}; */
/* transform_translate(mod_tran, amount, TS_LOCAL); */
struct Entity* model = entity_get(2);
struct Transform* mod_tran = entity_component_get(model, C_TRANSFORM);
vec3 amount = {0, 0, -5 * dt};
transform_translate(mod_tran, amount, TS_LOCAL);
vec3 y_axis = {0, 0, 1};
transform_rotate(mod_tran, &y_axis, 25.f * dt, TS_WORLD);
}
}

@ -116,12 +116,12 @@ void geom_remove(int index)
geometry->ref_count--;
if(geometry->ref_count < 0)
{
array_free(geometry->indices);
array_free(geometry->vertices);
array_free(geometry->uvs);
array_free(geometry->normals);
array_free(geometry->vertex_colors);
free(geometry->filename);
if(geometry->indices) array_free(geometry->indices);
if(geometry->vertices) array_free(geometry->vertices);
if(geometry->uvs) array_free(geometry->uvs);
if(geometry->normals) array_free(geometry->normals);
if(geometry->vertex_colors) array_free(geometry->vertex_colors);
if(geometry->filename) free(geometry->filename);
array_push(empty_indices, index, int);
}
}

File diff suppressed because it is too large Load Diff

@ -50,6 +50,7 @@ int model_create(int node, const char* geo_name)
new_model->node = node;
new_model->geometry_index = geo_index;
new_model->shader = 0; /* Temporary, for test run only till materials are added */
vec4_fill(&new_model->color, 0.7f, 0.7f, 0.5f, 1.f);
}
else
{
@ -94,13 +95,12 @@ void model_render_all(struct Camera* camera)
struct Model* model = &model_list[i];
struct Entity* entity = entity_get(model->node);
struct Transform* transform = entity_component_get(entity, C_TRANSFORM);
mat4_identity(mvp);
mat4_identity(&mvp);
shader_bind(model->shader);
mat4_mul(mvp, camera->view_proj_mat, transform->trans_mat);
shader_set_uniform_mat4(model->shader, "mvp", mvp);
vec4 color = {0.7f, 0.7f, 0.5f, 1};
shader_set_uniform_vec4(model->shader, "color", color);
mat4_mul(&mvp, &camera->view_proj_mat, &transform->trans_mat);
shader_set_uniform_mat4(model->shader, "mvp", &mvp);
shader_set_uniform_vec4(model->shader, "color", &model->color);
geom_render(model->geometry_index);
shader_unbind();
}

@ -1,6 +1,8 @@
#ifndef model_H
#define model_H
#include "linmath.h"
struct Camera;
struct Model
@ -8,6 +10,7 @@ struct Model
int node;
int geometry_index;
int shader; /* Temporary, replace with material */
vec4 color;
};
struct Model* model_get(int index);

@ -10,6 +10,7 @@ void on_framebuffer_size_change(GLFWwindow* window, int width, int height);
void renderer_init(GLFWwindow* window)
{
glClearColor(0.3f, 0.6f, 0.9f, 1.0f);
glEnable(GL_DEPTH_TEST);
glfwSetFramebufferSizeCallback(window, on_framebuffer_size_change);
}

@ -258,32 +258,32 @@ void shader_set_uniform_float(const int shader_index, const char* name, const fl
glUniform1f(location, value);
}
void shader_set_uniform_vec2(const int shader_index, const char* name, const vec2 value)
void shader_set_uniform_vec2(const int shader_index, const char* name, const vec2* value)
{
GLint location = shader_get_uniform_location(shader_index, name);
if(location >= 0)
glUniform2fv(location, 1, value);
glUniform2fv(location, 1, &value->x);
}
void shader_set_uniform_vec3(const int shader_index, const char* name, const vec3 value)
void shader_set_uniform_vec3(const int shader_index, const char* name, const vec3* value)
{
GLint location = shader_get_uniform_location(shader_index, name);
if(location >= 0)
glUniform3fv(location, 1, value);
glUniform3fv(location, 1, &value->x);
}
void shader_set_uniform_vec4(const int shader_index, const char* name, const vec4 value)
void shader_set_uniform_vec4(const int shader_index, const char* name, const vec4* value)
{
GLint location = shader_get_uniform_location(shader_index, name);
if(location >= 0)
glUniform4fv(location, 1, value);
glUniform4fv(location, 1, &value->x);
}
void shader_set_uniform_mat4(const int shader_index, const char* name, const mat4 value)
void shader_set_uniform_mat4(const int shader_index, const char* name, const mat4* value)
{
GLint location = shader_get_uniform_location(shader_index, name);
if(location >= 0)
glUniformMatrix4fv(location, 1, GL_FALSE, *value);
glUniformMatrix4fv(location, 1, GL_FALSE, &value->mat[0]);
}
void shader_remove(const int shader_index)

@ -10,10 +10,10 @@ void shader_remove(const int shader_index);
void shader_unbind(void);
void shader_set_uniform_int(const int shaderIndex, const char* name, const int value);
void shader_set_uniform_float(const int shaderIndex, const char* name, const float value);
void shader_set_uniform_vec2(const int shaderIndex, const char* name, const vec2 value);
void shader_set_uniform_vec3(const int shaderIndex, const char* name, const vec3 value);
void shader_set_uniform_vec4(const int shaderIndex, const char* name, const vec4 value);
void shader_set_uniform_mat4(const int shaderIndex, const char* name, const mat4 value);
void shader_set_uniform_vec2(const int shaderIndex, const char* name, const vec2* value);
void shader_set_uniform_vec3(const int shaderIndex, const char* name, const vec3* value);
void shader_set_uniform_vec4(const int shaderIndex, const char* name, const vec4* value);
void shader_set_uniform_mat4(const int shaderIndex, const char* name, const mat4* value);
void shader_cleanup(void);
int shader_uniform_location_get(const int shader_index, const char* name);

@ -2,6 +2,7 @@
#include "log.h"
#include "array.h"
#include "entity.h"
#include "utils.h"
#include <assert.h>
static struct Transform* transform_list;
@ -37,138 +38,116 @@ int transform_create(int node)
index = array_len(transform_list) - 1;
}
new_transform->node = node;
new_transform->position[0] = new_transform->position[1] = new_transform->position[2] = 0;
new_transform->scale[0] = new_transform->scale[1] = new_transform->scale[2] = 1;
//mat4_identity(new_transform->rotation);
quat_identity(new_transform->rotq);
vec3_fill(&new_transform->position, 0.f, 0.f, 0.f);
vec3_fill(&new_transform->scale, 1.f, 1.f, 1.f);
quat_identity(&new_transform->rotation);
transform_update_transmat(new_transform);
}
return index;
}
void transform_translate(struct Transform* transform, vec3 amount, enum Transform_Space space)
void transform_translate(struct Transform* transform, vec3* amount, enum Transform_Space space)
{
if(space == TS_LOCAL)
{
mat4 temp;
mat4_identity(temp);
mat4_from_quat(temp, transform->rotq);
mat4_mul_vec3(amount, temp, amount);
//mat4_mul_vec3(amount, transform->rotation, amount);
//quat_mul_vec3(amount, transform->rotq, amount);
quat_mul_vec3(amount, &transform->rotation, amount);
}
if(space == TS_PARENT)
else if(space == TS_PARENT)
{
struct Entity* parent = entity_get_parent(transform->node);
struct Transform* parent_tran = entity_component_get(parent, C_TRANSFORM);
//mat4_mul_vec3(amount, parent_tran->rotation, amount);
quat_mul_vec3(amount, parent_tran->rotq, amount);
quat_mul_vec3(amount, &parent_tran->rotation, amount);
}
vec3_add(transform->position, transform->position, amount);
vec3_add(&transform->position, &transform->position, amount);
transform_update_transmat(transform);
}
void transform_rotate(struct Transform* transform,
vec3 axis,
vec3* axis,
float angle,
enum Transform_Space space)
{
//mat4 new_rot;
quat new_rotq;
/* mat4_identity(new_rot); */
/* mat4_rotate(new_rot, new_rot, axis[0], axis[1], axis[2], TO_RADIANS(angle)); */
quat_identity(new_rotq);
quat_rotate(new_rotq, TO_RADIANS(angle), axis);
quat new_rot;
quat_identity(&new_rot);
quat_axis_angle(&new_rot, axis, TO_RADIANS(angle));
if(space == TS_LOCAL)
quat_mul(transform->rotq, transform->rotq, new_rotq);
else if(space == TS_WORLD)
quat_mul(transform->rotq, new_rotq, transform->rotq);
quat_norm(transform->rotq, transform->rotq);
quat_mul(&transform->rotation, &transform->rotation, &new_rot);
else
quat_mul(&transform->rotation, &new_rot, &transform->rotation);
transform_update_transmat(transform);
}
void transform_scale(struct Transform* transform, vec3 scale)
void transform_scale(struct Transform* transform, vec3* scale)
{
transform->scale[0] = scale[0];
transform->scale[1] = scale[1];
transform->scale[2] = scale[2];
vec3_assign(&transform->scale, scale);
transform_update_transmat(transform);
}
void transform_get_forward(struct Transform* transform, vec3 res)
void transform_get_forward(struct Transform* transform, vec3* res)
{
res[0] = 0; res[1] = 0; res[2] = -1;
//mat4_mul_vec3(res, transform->rotation, res);
mat4 temp;
mat4_identity(temp);
mat4_from_quat(temp, transform->rotq);
mat4_mul_vec3(res, temp, res);
//quat_mul_vec3(res, transform->rotq, res);
vec3_fill(res, 0.f, 0.f, -1.f);
quat_get_forward_rh(res, &transform->rotation);
}
void transform_get_lookat(struct Transform* transform, vec3 res)
void transform_get_lookat(struct Transform* transform, vec3* res)
{
transform_get_forward(transform, res);
vec3_mul_cross(res, transform->position, res);
vec3_add(res, &transform->position, res);
}
void transform_get_absolute_forward(struct Transform* transform, vec3 res)
void transform_get_absolute_forward(struct Transform* transform, vec3* res)
{
res[0] = 0.f; res[0] = 0.f; res[0] = -1.f;
//mat4_mul_vec3(res, transform->trans_mat, res);
quat_mul_vec3(res, transform->rotq, res);
vec3_norm(res, res);
vec3_fill(res, 0.f, 0.f, -1.f);
vec3_transform_norm(res, res, &transform->trans_mat);
}
void transform_get_absolute_lookat(struct Transform* transform, vec3 res)
void transform_get_absolute_lookat(struct Transform* transform, vec3* res)
{
vec3 abs_position = {0.f};
transform_get_absolute_pos(transform, abs_position);
vec3 abs_position = {0.f, 0.f, 0.f};
transform_get_absolute_pos(transform, &abs_position);
transform_get_absolute_forward(transform, res);
vec3_add(res, abs_position, res);
vec3_add(res, &abs_position, res);
}
void transform_get_up(struct Transform* transform, vec3* res)
{
vec3_fill(res, 0.f, 1.f, 0.f);
quat_get_up(res, &transform->rotation);
}
void transform_get_up(struct Transform* transform, vec3 res)
void transform_get_absolute_up(struct Transform* transform, vec3* res)
{
res[0] = 0; res[1] = 1; res[2] = 0;
//mat4_mul_vec3(res, transform->rotation, res);
mat4 temp;
mat4_identity(temp);
mat4_from_quat(temp, transform->rotq);
mat4_mul_vec3(res, temp, res);
//quat_mul_vec3(res, transform->rotq, res);
vec3_fill(res, 0.f, 1.f, 0.f);
vec3_transform_norm(res, res, &transform->trans_mat);
}
void transform_get_right(struct Transform* transform, vec3 res)
void transform_get_right(struct Transform* transform, vec3* res)
{
res[0] = 1; res[1] = 0; res[2] = 0;
//mat4_mul_vec3(res, transform->rotation, res);
quat_mul_vec3(res, transform->rotq, res);
vec3_fill(res, 1.f, 0.f, 0.f);
quat_get_right(res, &transform->rotation);
}
void transform_update_transmat(struct Transform* transform)
{
static mat4 scale, translation, rot;
mat4_identity(scale);
mat4_identity(translation);
mat4_identity(rot);
mat4_identity(transform->trans_mat);
mat4_scale_aniso(scale, scale, transform->scale[0], transform->scale[1], transform->scale[2]);
mat4_translate(translation, transform->position[0], transform->position[1], transform->position[2]);
mat4_from_quat(rot, transform->rotq);
static mat4 scale, translation, rotation;
mat4_identity(&scale);
mat4_identity(&translation);
mat4_identity(&rotation);
mat4_identity(&transform->trans_mat);
mat4_scale(&scale, transform->scale.x, transform->scale.y, transform->scale.z);
mat4_translate(&translation, transform->position.x, transform->position.y, transform->position.z);
mat4_from_quat(&rotation, &transform->rotation);
mat4_mul(transform->trans_mat, transform->trans_mat, translation);
//mat4_mul(transform->trans_mat, transform->trans_mat, transform->rotation);
mat4_mul(transform->trans_mat, transform->trans_mat, rot);
mat4_mul(transform->trans_mat, transform->trans_mat, scale);
mat4_mul(&transform->trans_mat, &transform->trans_mat, &translation);
mat4_mul(&transform->trans_mat, &transform->trans_mat, &rotation);
mat4_mul(&transform->trans_mat, &transform->trans_mat, &scale);
struct Entity* entity = entity_get(transform->node);
struct Entity* parent = entity_get(entity->parent);
if(parent)
{
struct Transform* parent_tran = entity_component_get(parent, C_TRANSFORM);
mat4_mul(transform->trans_mat, transform->trans_mat, parent_tran->trans_mat);
//mat4_mul(transform->trans_mat, parent_tran->trans_mat, transform->trans_mat);
mat4_mul(&transform->trans_mat, &transform->trans_mat, &parent_tran->trans_mat);
}
/* Update all children */
@ -198,14 +177,13 @@ void transform_remove(int index)
array_push(empty_indices, index, int);
}
void transform_set_position(struct Transform* transform, vec3 new_position)
void transform_set_position(struct Transform* transform, vec3* new_position)
{
for(int i = 0; i < 3; i++)
transform->position[i] = new_position[i];
vec3_assign(&transform->position, new_position);
transform_update_transmat(transform);
}
void transform_get_absolute_pos(struct Transform* transform, vec3 res)
void transform_get_absolute_pos(struct Transform* transform, vec3* res)
{
struct Entity* entity = entity_get(transform->node);
struct Entity* parent = entity_get(entity->parent);
@ -214,5 +192,5 @@ void transform_get_absolute_pos(struct Transform* transform, vec3 res)
struct Transform* parent_tran = entity_component_get(parent, C_TRANSFORM);
transform_get_absolute_pos(parent_tran, res);
}
vec3_add(res, res, transform->position);
vec3_add(res, res, &transform->position);
}

@ -10,9 +10,8 @@ struct Transform
int node;
vec3 position;
vec3 scale;
//mat4 rotation;
quat rotation;
mat4 trans_mat;
quat rotq;
};
struct Transform* transform_get(int index);
@ -20,19 +19,20 @@ void transform_remove(int index);
void transform_init(void);
void transform_cleanup(void);
int transform_create(int node);
void transform_translate(struct Transform* transform, vec3 amount, enum Transform_Space space);
void transform_translate(struct Transform* transform, vec3* amount, enum Transform_Space space);
void transform_rotate(struct Transform* transform,
vec3 axis,
vec3* axis,
float angle,
enum Transform_Space space);
void transform_scale(struct Transform* transform, vec3 scale);
void transform_set_position(struct Transform* transform, vec3 new_position);
void transform_get_forward(struct Transform* transform, vec3 res);
void transform_get_lookat(struct Transform* transform, vec3 res);
void transform_get_up(struct Transform* transform, vec3 res);
void transform_get_right(struct Transform* transform, vec3 res);
void transform_scale(struct Transform* transform, vec3* scale);
void transform_set_position(struct Transform* transform, vec3* new_position);
void transform_get_forward(struct Transform* transform, vec3* res);
void transform_get_lookat(struct Transform* transform, vec3* res);
void transform_get_up(struct Transform* transform, vec3* res);
void transform_get_right(struct Transform* transform, vec3* res);
void transform_update_transmat(struct Transform* transform);
void transform_get_absolute_pos(struct Transform* transform, vec3 res);
void transform_get_absolute_lookat(struct Transform* transform, vec3 res);
void transform_get_absolute_pos(struct Transform* transform, vec3* res);
void transform_get_absolute_lookat(struct Transform* transform, vec3* res);
void transform_get_absolute_up(struct Transform* transform, vec3* res);
#endif

@ -0,0 +1,27 @@
#include "utils.h"
#include <stdio.h>
#include <string.h>
#define BUFF_SIZE 64
static char str_buff[BUFF_SIZE];
const char* tostr_vec3(vec3* v)
{
memset(str_buff, '\0', BUFF_SIZE);
snprintf(str_buff, BUFF_SIZE, "(%.3f, %.3f, %.3f)", v->x, v->y, v->z);
return str_buff;
}
const char* tostr_vec4(vec4* v)
{
memset(str_buff, '\0', BUFF_SIZE);
snprintf(str_buff, BUFF_SIZE, "(%.3f, %.3f, %.3f, %.3f)", v->x, v->y, v->z, v->w);
return str_buff;
}
const char* tostr_quat(quat* q)
{
memset(str_buff, '\0', BUFF_SIZE);
snprintf(str_buff, BUFF_SIZE, "(%.3f, %.3f, %.3f, %.3f)", q->x, q->y, q->z, q->w);
return str_buff;
}

@ -0,0 +1,10 @@
#ifndef utils_H
#define utils_H
#include "linmath.h"
const char* tostr_vec3(vec3* v);
const char* tostr_vec4(vec4* v);
const char* tostr_quat(quat* q);
#endif
Loading…
Cancel
Save