]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_models.c
fixed animated textures in realtime lighting mode (now calls R_UpdateTextureInfo)
[xonotic/darkplaces.git] / gl_models.c
index 46e13975a01b0de58ec0b8bcaa01351520f1af35..223be1b81b87af20c877d54b988831638ee23e9e 100644 (file)
@@ -234,10 +234,9 @@ void R_DrawAliasModelCallback (const void *calldata1, int calldata2)
                                m.texrgbscale[0] = 4;
                        }
                }
-               R_Mesh_State_Texture(&m);
+               m.pointer_vertex = varray_vertex3f;
 
                c_alias_polys += mesh->num_triangles;
-               GL_VertexPointer(varray_vertex3f);
                R_Model_Alias_GetMesh_Array3f(ent, mesh, MODELARRAY_VERTEX, varray_vertex3f);
                if (layer->flags & ALIASLAYER_FOG)
                {
@@ -247,11 +246,6 @@ void R_DrawAliasModelCallback (const void *calldata1, int calldata2)
                else
                {
                        fullbright = !(layer->flags & ALIASLAYER_DIFFUSE) || r_fullbright.integer || (ent->effects & EF_FULLBRIGHT);
-                       if (r_shadow_realtime_world.integer && r_shadow_realtime_world_lightmaps.value <= 0 && !fullbright)
-                       {
-                               colorscale *= r_ambient.value * (2.0f / 128.0f);
-                               fullbright = true;
-                       }
                        if (layer->flags & (ALIASLAYER_COLORMAP_PANTS | ALIASLAYER_COLORMAP_SHIRT))
                        {
                                // 128-224 are backwards ranges
@@ -266,7 +260,7 @@ void R_DrawAliasModelCallback (const void *calldata1, int calldata2)
                        }
                        else
                                tint[0] = tint[1] = tint[2] = 1;
-                       if (r_shadow_realtime_world.integer)
+                       if (r_shadow_realtime_world.integer && !fullbright)
                                VectorScale(tint, r_shadow_realtime_world_lightmaps.value, tint);
                        colorscale *= ifog;
                        if (fullbright)
@@ -275,7 +269,7 @@ void R_DrawAliasModelCallback (const void *calldata1, int calldata2)
                        {
                                if (R_LightModel(ambientcolor4f, diffusecolor, diffusenormal, ent, tint[0] * colorscale, tint[1] * colorscale, tint[2] * colorscale, ent->alpha, false))
                                {
-                                       GL_ColorPointer(varray_color4f);
+                                       m.pointer_color = varray_color4f;
                                        R_Model_Alias_GetMesh_Array3f(ent, mesh, MODELARRAY_NORMAL, varray_normal3f);
                                        R_LightModel_CalcVertexColors(ambientcolor4f, diffusecolor, diffusenormal, mesh->num_vertices, varray_vertex3f, varray_normal3f, varray_color4f);
                                }
@@ -283,7 +277,10 @@ void R_DrawAliasModelCallback (const void *calldata1, int calldata2)
                                        GL_Color(ambientcolor4f[0], ambientcolor4f[1], ambientcolor4f[2], ambientcolor4f[3]);
                        }
                }
+               R_Mesh_State(&m);
+               GL_LockArrays(0, mesh->num_vertices);
                R_Mesh_Draw(mesh->num_vertices, mesh->num_triangles, mesh->data_element3i);
+               GL_LockArrays(0, 0);
        }
 }
 
@@ -313,7 +310,7 @@ void R_Model_Alias_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightor
        float projectdistance;
        if (ent->effects & EF_ADDITIVE || ent->alpha < 1)
                return;
-       projectdistance = lightradius + ent->model->radius - sqrt(DotProduct(relativelightorigin, relativelightorigin));
+       projectdistance = lightradius + ent->model->radius;// - sqrt(DotProduct(relativelightorigin, relativelightorigin));
        if (projectdistance > 0.1)
        {
                R_Mesh_Matrix(&ent->matrix);
@@ -323,7 +320,7 @@ void R_Model_Alias_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightor
                        if (skin->flags & ALIASSKIN_TRANSPARENT)
                                continue;
                        R_Model_Alias_GetMesh_Array3f(ent, mesh, MODELARRAY_VERTEX, varray_vertex3f);
-                       R_Shadow_Volume(mesh->num_vertices, mesh->num_triangles, varray_vertex3f, mesh->data_element3i, mesh->data_neighbor3i, relativelightorigin, lightradius, projectdistance);
+                       R_Shadow_VolumeFromSphere(mesh->num_vertices, mesh->num_triangles, varray_vertex3f, mesh->data_element3i, mesh->data_neighbor3i, relativelightorigin, projectdistance, lightradius);
                }
        }
 }
@@ -383,7 +380,7 @@ void R_Model_Alias_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, v
                        if (layer->flags & ALIASLAYER_SPECULAR)
                        {
                                c_alias_polys += mesh->num_triangles;
-                               R_Shadow_SpecularLighting(mesh->num_vertices, mesh->num_triangles, mesh->data_element3i, aliasvert_vertex3f, aliasvert_svector3f, aliasvert_tvector3f, aliasvert_normal3f, mesh->data_texcoord2f, relativelightorigin, relativeeyeorigin, lightradius, lightcolor2, matrix_modeltolight, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, layer->texture, layer->nmap, lightcubemap);
+                               R_Shadow_RenderLighting(mesh->num_vertices, mesh->num_triangles, mesh->data_element3i, aliasvert_vertex3f, aliasvert_svector3f, aliasvert_tvector3f, aliasvert_normal3f, mesh->data_texcoord2f, relativelightorigin, relativeeyeorigin, lightcolor2, matrix_modeltolight, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, layer->texture, layer->nmap, layer->texture, lightcubemap, LIGHTING_SPECULAR);
                        }
                        else if (layer->flags & ALIASLAYER_DIFFUSE)
                        {
@@ -412,7 +409,7 @@ void R_Model_Alias_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, v
                                        lightcolor2[2] *= bcolor[2] * (1.0f / 255.0f);
                                }
                                c_alias_polys += mesh->num_triangles;
-                               R_Shadow_DiffuseLighting(mesh->num_vertices, mesh->num_triangles, mesh->data_element3i, aliasvert_vertex3f, aliasvert_svector3f, aliasvert_tvector3f, aliasvert_normal3f, mesh->data_texcoord2f, relativelightorigin, lightradius, lightcolor2, matrix_modeltolight, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, layer->texture, layer->nmap, lightcubemap);
+                               R_Shadow_RenderLighting(mesh->num_vertices, mesh->num_triangles, mesh->data_element3i, aliasvert_vertex3f, aliasvert_svector3f, aliasvert_tvector3f, aliasvert_normal3f, mesh->data_texcoord2f, relativelightorigin, relativeeyeorigin, lightcolor2, matrix_modeltolight, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, layer->texture, layer->nmap, layer->texture, lightcubemap, LIGHTING_DIFFUSE);
                        }
                }
        }
@@ -737,7 +734,6 @@ void R_DrawZymoticModelMeshCallback (const void *calldata1, int calldata2)
                GL_DepthMask(true);
        }
        GL_DepthTest(true);
-       GL_VertexPointer(varray_vertex3f);
 
        memset(&mstate, 0, sizeof(mstate));
        colorscale = 1.0f;
@@ -748,7 +744,7 @@ void R_DrawZymoticModelMeshCallback (const void *calldata1, int calldata2)
        }
        mstate.tex[0] = R_GetTexture(texture);
        mstate.pointer_texcoord[0] = ent->model->alias.zymdata_texcoords;
-       R_Mesh_State_Texture(&mstate);
+       mstate.pointer_vertex = varray_vertex3f;
 
        ZymoticLerpBones(ent->model->alias.zymnum_bones, (zymbonematrix *) ent->model->alias.zymdata_poses, ent->frameblend, ent->model->alias.zymdata_bones);
 
@@ -756,12 +752,15 @@ void R_DrawZymoticModelMeshCallback (const void *calldata1, int calldata2)
        ZymoticCalcNormal3f(numverts, varray_vertex3f, aliasvert_normal3f, ent->model->alias.zymnum_shaders, ent->model->alias.zymdata_renderlist);
        if (R_LightModel(ambientcolor4f, diffusecolor, diffusenormal, ent, ifog * colorscale, ifog * colorscale, ifog * colorscale, ent->alpha, false))
        {
-               GL_ColorPointer(varray_color4f);
+               mstate.pointer_color = varray_color4f;
                R_LightModel_CalcVertexColors(ambientcolor4f, diffusecolor, diffusenormal, numverts, varray_vertex3f, aliasvert_normal3f, varray_color4f);
        }
        else
                GL_Color(ambientcolor4f[0], ambientcolor4f[1], ambientcolor4f[2], ambientcolor4f[3]);
+       R_Mesh_State(&mstate);
+       GL_LockArrays(0, numverts);
        R_Mesh_Draw(numverts, numtriangles, elements);
+       GL_LockArrays(0, 0);
        c_alias_polys += numtriangles;
 
        if (fog)
@@ -769,17 +768,20 @@ void R_DrawZymoticModelMeshCallback (const void *calldata1, int calldata2)
                GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                GL_DepthMask(false);
                GL_DepthTest(true);
-               GL_VertexPointer(varray_vertex3f);
 
                memset(&mstate, 0, sizeof(mstate));
                // FIXME: need alpha mask for fogging...
                //mstate.tex[0] = R_GetTexture(texture);
                //mstate.pointer_texcoord = ent->model->alias.zymdata_texcoords;
-               R_Mesh_State_Texture(&mstate);
+               mstate.pointer_vertex = varray_vertex3f;
+               R_Mesh_State(&mstate);
 
                GL_Color(fogcolor[0], fogcolor[1], fogcolor[2], ent->alpha * fog);
                ZymoticTransformVerts(numverts, varray_vertex3f, ent->model->alias.zymdata_vertbonecounts, ent->model->alias.zymdata_verts);
+               R_Mesh_State(&mstate);
+               GL_LockArrays(0, numverts);
                R_Mesh_Draw(numverts, numtriangles, elements);
+               GL_LockArrays(0, 0);
                c_alias_polys += numtriangles;
        }
 }