[Bf-blender-cvs] [40d1cbf354a] cycles_procedural_api: read UV attributes

Kévin Dietrich noreply at git.blender.org
Sat Oct 3 04:18:22 CEST 2020


Commit: 40d1cbf354a606bba8c424257fe1de9f6b1d5fa0
Author: Kévin Dietrich
Date:   Mon Sep 28 14:50:31 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rB40d1cbf354a606bba8c424257fe1de9f6b1d5fa0

read UV attributes

===================================================================

M	intern/cycles/render/alembic.cpp
M	intern/cycles/render/alembic.h

===================================================================

diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp
index 1b5c7983363..1ad2d0bf4b8 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -66,52 +66,42 @@ static Transform make_transform(const Abc::M44d &a)
   return trans;
 }
 
-/* TODO: any attribute lookup should probably go through the AttributeRequests
- */
-static void read_uvs(const IV2fGeomParam &uvs,
-                     Geometry *node,
-                     const int *face_counts,
-                     const int num_faces)
+static void read_default_uvs(const IV2fGeomParam &uvs, const ISampleSelector &iss, AlembicObject::DataCache &data_cache)
 {
-  if (uvs.valid()) {
-    switch (uvs.getScope()) {
-      case kVaryingScope:
-      case kVertexScope: {
-        IV2fGeomParam::Sample uvsample = uvs.getExpandedValue();
-        break;
-      }
-      case kFacevaryingScope: {
-        IV2fGeomParam::Sample uvsample = uvs.getIndexedValue();
-
-        ustring name = ustring("UVMap");
-        Attribute *attr = node->attributes.add(ATTR_STD_UV, name);
-        float2 *fdata = attr->data_float2();
-
-        /* loop over the triangles */
-        int index_offset = 0;
-        const unsigned int *uvIndices = uvsample.getIndices()->get();
-        const Imath::Vec2<float> *uvValues = uvsample.getVals()->get();
-
-        for (size_t i = 0; i < num_faces; i++) {
-          for (int j = 0; j < face_counts[i] - 2; j++) {
-			unsigned int v0 = uvIndices[index_offset];
-			unsigned int v1 = uvIndices[index_offset + j + 1];
-			unsigned int v2 = uvIndices[index_offset + j + 2];
-
-            fdata[0] = make_float2(uvValues[v0][0], uvValues[v0][1]);
-            fdata[1] = make_float2(uvValues[v1][0], uvValues[v1][1]);
-            fdata[2] = make_float2(uvValues[v2][0], uvValues[v2][1]);
-            fdata += 3;
-          }
-
-          index_offset += face_counts[i];
-        }
+  switch (uvs.getScope()) {
+    case kFacevaryingScope: {
+      IV2fGeomParam::Sample uvsample = uvs.getIndexedValue(iss);
 
-        break;
+      if (!uvsample.valid()) {
+        return;
       }
-      default: {
-        break;
+
+      AlembicObject::AttributeData &attr = data_cache.attributes.emplace_back();
+      attr.std = ATTR_STD_UV;
+      attr.name = uvs.getName();
+      attr.data.resize(data_cache.triangles.size() * 3 * sizeof(float2));
+
+      float2 *data_float2 = reinterpret_cast<float2 *>(attr.data.data());
+
+      const unsigned int *indices = uvsample.getIndices()->get();
+      const Imath::Vec2<float> *values = uvsample.getVals()->get();
+
+      for (const int3 &loop : data_cache.triangles_loops) {
+        unsigned int v0 = indices[loop.x];
+        unsigned int v1 = indices[loop.y];
+        unsigned int v2 = indices[loop.z];
+
+        data_float2[0] = make_float2(values[v0][0], values[v0][1]);
+        data_float2[1] = make_float2(values[v1][0], values[v1][1]);
+        data_float2[2] = make_float2(values[v2][0], values[v2][1]);
+        data_float2 += 3;
       }
+
+      break;
+    }
+    default: {
+      // not supported
+      break;
     }
   }
 }
@@ -212,6 +202,7 @@ void AlembicObject::load_all_data(const IPolyMeshSchema &schema)
       }
 
       data_cache.triangles.reserve(num_triangles);
+      data_cache.triangles_loops.reserve(num_triangles);
       int index_offset = 0;
 
       for (size_t i = 0; i < num_faces; i++) {
@@ -221,12 +212,19 @@ void AlembicObject::load_all_data(const IPolyMeshSchema &schema)
           int v2 = face_indices_array[index_offset + j + 2];
 
           data_cache.triangles.push_back_reserved(make_int3(v0, v1, v2));
+          data_cache.triangles_loops.push_back_reserved(make_int3(index_offset, index_offset + j + 1, index_offset + j + 2));
         }
 
         index_offset += face_counts_array[i];
       }
     }
 
+    const IV2fGeomParam &uvs = schema.getUVsParam();
+
+    if (uvs.valid()) {
+      read_default_uvs(uvs, iss, data_cache);
+    }
+
     foreach (const AttributeRequest &attr, requested_attributes.requests) {
       read_attribute(schema.getArbGeomParams(), iss, attr.name, data_cache);
     }
@@ -245,20 +243,35 @@ void AlembicObject::read_attribute(const ICompoundProperty &arb_geom_params, con
     }
 
     if (IV2fProperty::matches(prop.getMetaData()) && Alembic::AbcGeom::isUV(prop)) {
-      // TODO : UV indices
-//      const IV2fGeomParam &param = IV2fGeomParam(arb_geom_params, prop.getName());
+      const IV2fGeomParam &param = IV2fGeomParam(arb_geom_params, prop.getName());
+
+      IV2fGeomParam::Sample sample;
+      param.getIndexed(sample, iss);
 
-//      IV2fGeomParam::Sample sample;
-//      param.getIndexed(sample, iss);
+      if (param.getScope() == kFacevaryingScope) {
+        V2fArraySamplePtr values = sample.getVals();
+        UInt32ArraySamplePtr indices = sample.getIndices();
 
-//      if (param.getScope() == kFacevaryingScope) {
-//        V2fArraySamplePtr values = sample.getVals();
-//        UInt32ArraySamplePtr indices = sample.getIndices();
+        AttributeData &attribute = data_cache.attributes.emplace_back();
+        attribute.std = ATTR_STD_NONE;
+        attribute.name = attr_name;
+        attribute.element = ATTR_ELEMENT_CORNER;
+        attribute.type_desc = TypeFloat2;
+        attribute.data.resize(data_cache.triangles.size() * 3 * sizeof(float2));
 
-//        AttributeData &attribute = data_cache.attributes.emplace_back();
-//        attribute.name = attr_name;
-//        attribute.std = ATTR_STD_UV;
-//      }
+        float2 *data_float2 = reinterpret_cast<float2 *>(attribute.data.data());
+
+        for (const int3 &loop : data_cache.triangles_loops) {
+          unsigned int v0 = (*indices)[loop.x];
+          unsigned int v1 = (*indices)[loop.y];
+          unsigned int v2 = (*indices)[loop.z];
+
+          data_float2[0] = make_float2((*values)[v0][0], (*values)[v0][1]);
+          data_float2[1] = make_float2((*values)[v1][0], (*values)[v1][1]);
+          data_float2[2] = make_float2((*values)[v2][0], (*values)[v2][1]);
+          data_float2 += 3;
+        }
+      }
     }
     else if (IC3fProperty::matches(prop.getMetaData())) {
       const IC3fGeomParam &param = IC3fGeomParam(arb_geom_params, prop.getName());
@@ -498,10 +511,6 @@ void AlembicProcedural::read_mesh(Scene *scene,
     mesh->set_shader(shader);
   }
 
-  IPolyMeshSchema::Sample samp = schema.getValue(sample_sel);
-  IV2fGeomParam uvs = polymesh.getSchema().getUVsParam();
-  read_uvs(uvs, mesh, samp.getFaceCounts()->get(), samp.getFaceCounts()->size());
-
   /* TODO: read normals from the archive if present */
   mesh->add_face_normals();
 
diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h
index fe9d45b4f16..0a894ab07bf 100644
--- a/intern/cycles/render/alembic.h
+++ b/intern/cycles/render/alembic.h
@@ -67,6 +67,7 @@ class AlembicObject : public Node {
     bool dirty = false;
     array<float3> vertices{};
     array<int3> triangles{};
+    array<int3> triangles_loops{};
 
     vector<AttributeData> attributes{};
   };



More information about the Bf-blender-cvs mailing list