Hello everyone.
I have this arm model with weapon for my FPS project. Current position of it is set so arm will be placed on the correct position on the screen. The problem is, since the weapon is not inside in the view area at the beginning, even after it’s in, it is not rendered.
I know it is related to the material and render script I am using and both of them are modified but not sure what part is responsible. The model has weapon tag so it will always be rendered on top. Here is the change I made on the render script:
--On Init:
self.predicates = create_predicates("tile", "gui", "particle", "model", "weapon", "debug_text")
--On Update
-- Clear the depth buffer
render.clear({ [graphics.BUFFER_TYPE_DEPTH_BIT] = 1 })
-- Keep using the same camera as world
local draw_options_weapon = state.cameras.camera_world.options
-- Enable depth test for correct sorting within weapon parts
render.enable_state(graphics.STATE_DEPTH_TEST)
render.enable_state(graphics.STATE_CULL_FACE)
render.set_depth_mask(true)
-- Draw only weapon-tagged models
render.draw(predicates.weapon, draw_options_weapon)
render.draw_debug3d()
-- Clean up
render.disable_state(graphics.STATE_CULL_FACE)
render.disable_state(graphics.STATE_DEPTH_TEST)
render.set_depth_mask(false)
Also, the models I use are not rendered at their correct world position so it may be the culprit too..
Here is the model using the modified material (so illumination can be used with animations) on editor:
On game:
Here is the my modified vertex program. Only main is changed:
//
// model.vp (Skinned)
// Based on Illumination shader by astrochili
// Modified to support skinned models and animations
//
attribute highp vec4 position;
attribute mediump vec2 texcoord0;
attribute mediump vec2 texcoord1;
attribute mediump vec3 normal;
attribute mediump vec4 bone_weights;
attribute mediump vec4 bone_indices;
uniform mediump mat4 mtx_world;
uniform mediump mat4 mtx_view;
uniform mediump mat4 mtx_proj;
uniform mediump vec4 animation_data;
varying highp vec3 camera_position;
varying highp vec3 world_position;
varying highp vec3 view_position;
varying mediump vec3 world_normal;
varying mediump vec2 texture_coord;
varying mediump vec2 light_map_coord;
#include "/builtins/materials/skinning.glsl"
mat3 mat4_to_mat3(mat4 m) {
return mat3(
m[0][0], m[0][1], m[0][2],
m[1][0], m[1][1], m[1][2],
m[2][0], m[2][1], m[2][2]
);
}
mat3 mat3_transpose(mat3 m) {
return mat3(
m[0][0], m[1][0], m[2][0],
m[0][1], m[1][1], m[2][1],
m[0][2], m[1][2], m[2][2]
);
}
mat3 mat3_inverse(mat3 m) {
float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
float b01 = a22 * a11 - a12 * a21;
float b11 = -a22 * a10 + a12 * a20;
float b21 = a21 * a10 - a11 * a20;
float det = a00 * b01 + a01 * b11 + a02 * b21;
return mat3(
b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11),
b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),
b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)
) / det;
}
mat4 mat4_inverse(mat4 m) {
float
a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],
a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],
a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],
a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],
b00 = a00 * a11 - a01 * a10,
b01 = a00 * a12 - a02 * a10,
b02 = a00 * a13 - a03 * a10,
b03 = a01 * a12 - a02 * a11,
b04 = a01 * a13 - a03 * a11,
b05 = a02 * a13 - a03 * a12,
b06 = a20 * a31 - a21 * a30,
b07 = a20 * a32 - a22 * a30,
b08 = a20 * a33 - a23 * a30,
b09 = a21 * a32 - a22 * a31,
b10 = a21 * a33 - a23 * a31,
b11 = a22 * a33 - a23 * a32,
det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
return mat4(
a11 * b11 - a12 * b10 + a13 * b09,
a02 * b10 - a01 * b11 - a03 * b09,
a31 * b05 - a32 * b04 + a33 * b03,
a22 * b04 - a21 * b05 - a23 * b03,
a12 * b08 - a10 * b11 - a13 * b07,
a00 * b11 - a02 * b08 + a03 * b07,
a32 * b02 - a30 * b05 - a33 * b01,
a20 * b05 - a22 * b02 + a23 * b01,
a10 * b10 - a11 * b08 + a13 * b06,
a01 * b08 - a00 * b10 - a03 * b06,
a30 * b04 - a31 * b02 + a33 * b00,
a21 * b02 - a20 * b04 - a23 * b00,
a11 * b07 - a10 * b09 - a12 * b06,
a00 * b09 - a01 * b07 + a02 * b06,
a31 * b01 - a30 * b03 - a32 * b00,
a20 * b03 - a21 * b01 + a22 * b00
) / det;
}
void main() {
mat4 mtx_inv_view = mat4_inverse(mtx_view);
camera_position = (mtx_inv_view * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
// Applies bone-based skinning
vec4 skinned_position = get_skinned_position(position);
vec4 _world_position = mtx_world * vec4(skinned_position.xyz, 1.0);
world_position = _world_position.xyz;
vec4 _view_position = mtx_view * _world_position;
view_position = _view_position.xyz;
mat3 mtx_normal = mat3_transpose(mat3_inverse(mat4_to_mat3(mtx_world)));
world_normal = normalize(mtx_normal * normal);
texture_coord = texcoord0;
light_map_coord = texcoord1;
gl_Position = mtx_proj * _view_position;
}
Thank you


