[Solved] Shadow mapping

I’m having issues with my shadow map, here’s the result:

the top image is of the shadow produced(from the camera’s perspective), the bottom (red) is the color render from the light’s perspective(the depth texture is as expected)

Here’s the code, I think it has something to do with the matrix transforms, but I’m not sure.

main loop:

		camera.updateProjection(g_gl, g_glu, window_width, window_height);
		renderFromLightPosToTexture();
		camera.updateModelView(g_gl, true);
		renderShadow();
private void renderFromLightPosToTexture()
	{
		g_gl.glMatrixMode(GL2.GL_MODELVIEW);
		g_gl.glLoadIdentity();
		
		g_gl.glRotatef(light_dir.m_x, 1.0f, 0.0f, 0.0f);
		g_gl.glRotatef(light_dir.m_y, 0.0f, 1.0f, 0.0f);
		Vector3 translate = engine.m_light.getTransform().getTranslate();
		g_gl.glTranslatef(-translate.m_x, -translate.m_y, -translate.m_z);
		
		float[] matrix_array = new float[16];
		g_gl.glGetFloatv(GL2.GL_PROJECTION_MATRIX, matrix_array, 0);
		Matrix4 proj_matrix = new Matrix4();
		proj_matrix.setMatrix(matrix_array);

	    matrix_array = new float[16];
	    g_gl.glGetFloatv(GL2.GL_MODELVIEW_MATRIX, matrix_array, 0);
		Matrix4 modelview_matrix = new Matrix4();
		modelview_matrix.setMatrix(matrix_array);
		
		Matrix4 bias_matrix = new Matrix4().initBiasMatrix();
		bias_matrix.transpose();//make column major
		shadow_matrix = bias_matrix.multiply(proj_matrix.multiply(modelview_matrix));
		
		depth_fbo.bindFrameBuffer(g_gl);
		mesh.draw(g_gl, true, false, false, false, false, 0, "basic_anim", engine.m_light.getTransform().getTranslate(), camera.getPosition(), shadow_matrix);
		depth_fbo.unBindFrameBuffer(g_gl);
	}
	private void renderShadow()
	{
		shadow_fbo.bindFrameBuffer(g_gl);
		mesh.draw(g_gl, true, false, false, false, false, depth_fbo.getDepthTextureHandle(), "shadow", engine.m_light.getTransform().getTranslate(), camera.getPosition(), shadow_matrix);
		shadow_fbo.unBindFrameBuffer(g_gl);
	}

vertex shader:

#version 130
in vec3 vert_pos;

uniform mat4 modelview_matrix;
uniform mat4 projection_matrix;
uniform mat4 light_model_view_proj_matrix;

out vec4 light_vertex_pos;

void main(void)
{   
   gl_Position = projection_matrix * modelview_matrix * vec4(vert_pos.xyz, 1.0);
   
   light_vertex_pos = light_model_view_proj_matrix * vec4(vert_pos, 1.0);
}

frag shader:

#version 130
in vec4 light_vertex_pos;

uniform sampler2D shadow_map;

out vec4 out_color;

void main(void)
{
   vec4 shadow_coord;
   shadow_coord.x = light_vertex_pos.x / light_vertex_pos.w;
   shadow_coord.y = light_vertex_pos.y / light_vertex_pos.w;
   shadow_coord.z = light_vertex_pos.z / light_vertex_pos.w;
   shadow_coord.w = light_vertex_pos.w / light_vertex_pos.w;
   
   vec4 depth_val = texture2D(shadow_map, shadow_coord.xy);
   
   float shadow_val = 1.0;
   if(depth_val.z < shadow_coord.z)
      shadow_val = 0.5;
   
   out_color = vec4(shadow_val, shadow_val, shadow_val, 1.0);
}