diff options
| author | Dave Parks <davep@lindenlab.com> | 2022-09-12 19:48:33 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2022-09-12 19:48:33 -0500 | 
| commit | e49d602bd99f5a3b1257ba1bc7ded133eab1eb1c (patch) | |
| tree | 403cf561e8a8d3524de9eb27943310383e94250e /indra/newview | |
| parent | c5af5d10edb26d255d0aa2e27eedbbd3f514024e (diff) | |
SL-18095 Add tangents to mesh assets so we can calculate mikktspace tangents in the mesh's original coordinate frame.
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl | 2 | ||||
| -rw-r--r-- | indra/newview/llmodelpreview.cpp | 20 | 
2 files changed, 17 insertions, 5 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl index ca304f749a..f0f5208f52 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl @@ -94,6 +94,8 @@ void main()      //col = vec3(0,0,0);      //emissive = vary_tangent.xyz*0.5+0.5;      //emissive = vec3(sign*0.5+0.5); +    //emissive = vNt * 0.5 + 0.5; +    //emissive = tnorm*0.5+0.5;      // See: C++: addDeferredAttachments(), GLSL: softenLightF      frag_data[0] = vec4(col, 0.0);                                                   // Diffuse      frag_data[1] = vec4(emissive, vertex_color.a);                                   // PBR sRGB Emissive diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index c3fbada9db..2c0f0ae443 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -1308,9 +1308,10 @@ F32 LLModelPreview::genMeshOptimizerPerModel(LLModel *base_model, LLModel *targe      // extra space for normals and text coords      S32 tc_bytes_size = ((size_vertices * sizeof(LLVector2)) + 0xF) & ~0xF; -    LLVector4a* combined_positions = (LLVector4a*)ll_aligned_malloc<64>(sizeof(LLVector4a) * 2 * size_vertices + tc_bytes_size); +    LLVector4a* combined_positions = (LLVector4a*)ll_aligned_malloc<64>(sizeof(LLVector4a) * 3 * size_vertices + tc_bytes_size);      LLVector4a* combined_normals = combined_positions + size_vertices; -    LLVector2* combined_tex_coords = (LLVector2*)(combined_normals + size_vertices); +    LLVector4a* combined_tangents = combined_normals + size_vertices; +    LLVector2* combined_tex_coords = (LLVector2*)(combined_tangents + size_vertices);      // copy indices and vertices into new buffers      S32 combined_positions_shift = 0; @@ -1320,6 +1321,9 @@ F32 LLModelPreview::genMeshOptimizerPerModel(LLModel *base_model, LLModel *targe      {          const LLVolumeFace &face = base_model->getVolumeFace(face_idx); +        // ensure tangents have been generated or loaded +        llassert(face.mMikktSpaceTangents); +          // Vertices          S32 copy_bytes = face.mNumVertices * sizeof(LLVector4a);          LLVector4a::memcpyNonAliased16((F32*)(combined_positions + combined_positions_shift), (F32*)face.mPositions, copy_bytes); @@ -1327,6 +1331,9 @@ F32 LLModelPreview::genMeshOptimizerPerModel(LLModel *base_model, LLModel *targe          // Normals          LLVector4a::memcpyNonAliased16((F32*)(combined_normals + combined_positions_shift), (F32*)face.mNormals, copy_bytes); +        // Tangents +        LLVector4a::memcpyNonAliased16((F32*)(combined_tangents + combined_positions_shift), (F32*)face.mMikktSpaceTangents, copy_bytes); +          // Tex coords          copy_bytes = face.mNumVertices * sizeof(LLVector2);          memcpy((void*)(combined_tex_coords + combined_positions_shift), (void*)face.mTexCoords, copy_bytes); @@ -1428,9 +1435,10 @@ F32 LLModelPreview::genMeshOptimizerPerModel(LLModel *base_model, LLModel *targe      // IV. Repack back into individual faces -    LLVector4a* buffer_positions = (LLVector4a*)ll_aligned_malloc<64>(sizeof(LLVector4a) * 2 * size_vertices + tc_bytes_size); +    LLVector4a* buffer_positions = (LLVector4a*)ll_aligned_malloc<64>(sizeof(LLVector4a) * 3 * size_vertices + tc_bytes_size);      LLVector4a* buffer_normals = buffer_positions + size_vertices; -    LLVector2* buffer_tex_coords = (LLVector2*)(buffer_normals + size_vertices); +    LLVector4a* buffer_tangents = buffer_normals + size_vertices; +    LLVector2* buffer_tex_coords = (LLVector2*)(buffer_tangents + size_vertices);      S32 buffer_idx_size = (size_indices * sizeof(U16) + 0xF) & ~0xF;      U16* buffer_indices = (U16*)ll_aligned_malloc_16(buffer_idx_size);      S32* old_to_new_positions_map = new S32[size_vertices]; @@ -1511,6 +1519,7 @@ F32 LLModelPreview::genMeshOptimizerPerModel(LLModel *base_model, LLModel *targe                      // Copy vertice, normals, tcs                      buffer_positions[buf_positions_copied] = combined_positions[idx];                      buffer_normals[buf_positions_copied] = combined_normals[idx]; +                    buffer_tangents[buf_positions_copied] = combined_tangents[idx];                      buffer_tex_coords[buf_positions_copied] = combined_tex_coords[idx];                      old_to_new_positions_map[idx] = buf_positions_copied; @@ -1549,12 +1558,13 @@ F32 LLModelPreview::genMeshOptimizerPerModel(LLModel *base_model, LLModel *targe          {              new_face.resizeIndices(buf_indices_copied);              new_face.resizeVertices(buf_positions_copied); - +            new_face.allocateTangents(buf_positions_copied, true);              S32 idx_size = (buf_indices_copied * sizeof(U16) + 0xF) & ~0xF;              LLVector4a::memcpyNonAliased16((F32*)new_face.mIndices, (F32*)buffer_indices, idx_size);              LLVector4a::memcpyNonAliased16((F32*)new_face.mPositions, (F32*)buffer_positions, buf_positions_copied * sizeof(LLVector4a));              LLVector4a::memcpyNonAliased16((F32*)new_face.mNormals, (F32*)buffer_normals, buf_positions_copied * sizeof(LLVector4a)); +            LLVector4a::memcpyNonAliased16((F32*)new_face.mMikktSpaceTangents, (F32*)buffer_tangents, buf_positions_copied * sizeof(LLVector4a));              U32 tex_size = (buf_positions_copied * sizeof(LLVector2) + 0xF)&~0xF;              LLVector4a::memcpyNonAliased16((F32*)new_face.mTexCoords, (F32*)buffer_tex_coords, tex_size);  | 
