139 lines
5.1 KiB
C++
139 lines
5.1 KiB
C++
/*
|
|
by korenkonder
|
|
GitHub/GitLab: korenkonder
|
|
*/
|
|
|
|
#include "object.hpp"
|
|
|
|
void (FASTCALL* objset_info_storage_unload_set)(int32_t set)
|
|
= (void (FASTCALL*)(int32_t set))0x00000001404599B0;
|
|
obj_mesh* (FASTCALL* objset_info_storage_get_obj_mesh_by_index)(uint32_t obj_info, int32_t mesh_index)
|
|
= (obj_mesh * (FASTCALL*)(uint32_t obj_info, int32_t mesh_index))0x0000000140459D40;
|
|
int32_t(FASTCALL* objset_info_storage_get_obj_mesh_index)(uint32_t obj_info, const char* mesh_name)
|
|
= (int32_t(FASTCALL*)(uint32_t obj_info, const char* mesh_name))0x0000000140459DE0;
|
|
const char* (FASTCALL* object_database_get_obj_name)(uint32_t obj_info)
|
|
= (const char* (FASTCALL*)(uint32_t obj_info))0x0000000140459F20;
|
|
uint32_t(FASTCALL* object_database_get_object_info)(const char* name)
|
|
= (uint32_t(FASTCALL*)(const char* name))0x0000000140459F80;
|
|
obj* (FASTCALL* objset_info_storage_get_obj)(uint32_t obj_info)
|
|
= (obj * (FASTCALL*)(uint32_t obj_info))0x000000014045A140;
|
|
obj_skin* (FASTCALL* objset_info_storage_get_obj_skin)(uint32_t obj_info)
|
|
= (obj_skin * (FASTCALL*)(uint32_t obj_info))0x000000014045A3E0;
|
|
int32_t(FASTCALL* objset_info_storage_get_set_obj_id)(int32_t set_index, int32_t obj_index)
|
|
= (int32_t(FASTCALL*)(int32_t set_index, int32_t obj_index))0x000000014045A750;
|
|
int32_t(FASTCALL* object_database_get_set_id)(int32_t set_index)
|
|
= (int32_t(FASTCALL*)(int32_t set_index))0x000000014045AA10;
|
|
int32_t(FASTCALL* object_database_get_object_set_id)(const char* name)
|
|
= (int32_t(FASTCALL*)(const char* name))0x000000014045AA60;
|
|
const char* (FASTCALL* objset_info_storage_get_set_name)(int32_t set_id)
|
|
= (const char* (FASTCALL*)(int32_t set_id))0x000000014045AC80;
|
|
int32_t(FASTCALL* objset_info_storage_get_set_tex_num)(int32_t set)
|
|
= (int32_t(FASTCALL*)(int32_t set))0x000000014045ADE0;
|
|
texture** (FASTCALL* objset_info_storage_get_set_textures)(int32_t set)
|
|
= (texture * *(FASTCALL*)(int32_t set))0x000000014045AE20;
|
|
int32_t(FASTCALL* objset_info_storage_load_set)(int32_t set)
|
|
= (int32_t(FASTCALL*)(int32_t set))0x000000014045C6A0;
|
|
bool (FASTCALL* objset_info_storage_load_obj_set_check_not_read)(int32_t set)
|
|
= (bool(FASTCALL*)(int32_t set))0x000000014045DA60;
|
|
|
|
obj_material_shader_lighting_type obj_material_shader_attrib::get_lighting_type() const {
|
|
if (!m.is_lgt_diffuse && !m.is_lgt_specular)
|
|
return OBJ_MATERIAL_SHADER_LIGHTING_CONSTANT;
|
|
else if (!m.is_lgt_specular)
|
|
return OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT;
|
|
else
|
|
return OBJ_MATERIAL_SHADER_LIGHTING_PHONG;
|
|
}
|
|
|
|
int32_t obj_texture_attrib::get_blend() const {
|
|
switch (m.blend) {
|
|
case 4:
|
|
return 2;
|
|
case 6:
|
|
return 1;
|
|
case 16:
|
|
return 3;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void obj_mesh_vertex_buffer::cycle_index() {
|
|
if (++index >= count)
|
|
index = 0;
|
|
}
|
|
|
|
AFTGLuint obj_mesh_vertex_buffer::get_buffer() {
|
|
if (index < count)
|
|
return buffers[index];
|
|
return 0;
|
|
}
|
|
|
|
inline int32_t obj_material_texture_type_get_texcoord_index(
|
|
obj_material_texture_type type, int32_t index) {
|
|
switch (type) {
|
|
case OBJ_MATERIAL_TEXTURE_COLOR:
|
|
if (index < 2)
|
|
return index;
|
|
case OBJ_MATERIAL_TEXTURE_NORMAL:
|
|
case OBJ_MATERIAL_TEXTURE_SPECULAR:
|
|
return 0;
|
|
case OBJ_MATERIAL_TEXTURE_TRANSLUCENCY:
|
|
case OBJ_MATERIAL_TEXTURE_TRANSPARENCY:
|
|
return 1;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
inline int32_t obj_material_texture_type_get_texture_index(
|
|
obj_material_texture_type type, int32_t base_index) {
|
|
switch (type) {
|
|
case OBJ_MATERIAL_TEXTURE_COLOR:
|
|
if (base_index < 2)
|
|
return base_index;
|
|
case OBJ_MATERIAL_TEXTURE_NORMAL:
|
|
return 2;
|
|
case OBJ_MATERIAL_TEXTURE_SPECULAR:
|
|
return 3;
|
|
case OBJ_MATERIAL_TEXTURE_TRANSLUCENCY:
|
|
return 1;
|
|
case OBJ_MATERIAL_TEXTURE_TRANSPARENCY:
|
|
return 4;
|
|
case OBJ_MATERIAL_TEXTURE_ENVIRONMENT_SPHERE: // AFT
|
|
case OBJ_MATERIAL_TEXTURE_ENVIRONMENT_CUBE:
|
|
return 5;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void obj_skin_set_matrix_buffer(obj_skin* s, const mat4* matrices,
|
|
const mat4* ex_data_matrices, mat4* matrix_buffer, const mat4* mat, const mat4& global_mat) {
|
|
if (!s->num_bone)
|
|
return;
|
|
|
|
uint32_t* bone_id = s->bone_id_array;
|
|
mat4* bone_matrix = s->bone_matrix_array;
|
|
if (mat)
|
|
for (int32_t i = 0; i < s->num_bone; i++, bone_id++, bone_matrix++, matrix_buffer++) {
|
|
mat4 temp;
|
|
if (*bone_id & 0x8000)
|
|
mat4_mul(&ex_data_matrices[*bone_id & 0x7FFF], mat, &temp);
|
|
else
|
|
mat4_mul(&matrices[*bone_id], mat, &temp);
|
|
|
|
mat4_mul(&global_mat, &temp, &temp);
|
|
mat4_mul(&temp, bone_matrix, matrix_buffer);
|
|
}
|
|
else
|
|
for (int32_t i = 0; i < s->num_bone; i++, bone_id++, bone_matrix++, matrix_buffer++) {
|
|
mat4 temp;
|
|
if (*bone_id & 0x8000)
|
|
temp = ex_data_matrices[*bone_id & 0x7FFF];
|
|
else
|
|
temp = matrices[*bone_id];
|
|
|
|
mat4_mul(&global_mat, &temp, &temp);
|
|
mat4_mul(&temp, bone_matrix, matrix_buffer);
|
|
}
|
|
}
|