Set UVWs for Ngons?
-
For updating the changed UVWs I am using: # Update UV data in Cinema 4D using updated data from RizomUV def update_uvs_in_cinema4d(doc, obj, poly_sizes, poly_uvw_ids, updated_uvws): # Retrieve the active document and object once doc, obj = get_active_object() if not obj or not isinstance(obj, c4d.PolygonObject): gui.MessageDialog("No Polygon Object selected.") return # Get the Polygon Translation Map poly_trans_map = obj.GetPolygonTranslationMap() polygon_count, ngon_map = poly_trans_map # Detect if there are ngons by checking if the ngonMap contains repeated values all_polygons = obj.GetAllPolygons() has_ngons = len(set(ngon_map)) != len(ngon_map) ngon_count = obj.GetNgonCount() print("Number of polygons including polygons inside any ngons: ", len(all_polygons)) print("Number of polygons including ngons: ",polygon_count) print("Number of ngons: ",ngon_count) print("Number of internal ngon edges: ",len(ngon_map) - len(set(ngon_map))) uvw_tag = obj.GetTag(c4d.Tuvw) if not uvw_tag: print("No UVW Tag found.") return doc.SetMode(c4d.Mpolygons) handle = c4d.modules.bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL) if handle is None: c4d.CallCommand(170103) # Open UV editor if c4d.API_VERSION >= 22000: c4d.modules.bodypaint.UpdateMeshUV(False) handle = c4d.modules.bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL) if handle is None: raise RuntimeError("No Active UVSet") uv_index = 0 assembled_uvws = [] adjusted_uvws = adjust_uvs(updated_uvws) # Ensure UVs are normalized correctly for poly_idx, poly_size in enumerate(poly_sizes): uv_dict = {} uv_indices = poly_uvw_ids[uv_index:uv_index + poly_size] uv_index += poly_size # Handle triangles if poly_size == 3: uv_dict = { 'c': c4d.Vector(adjusted_uvws[uv_indices[0] * 3], adjusted_uvws[uv_indices[0] * 3 + 1], adjusted_uvws[uv_indices[0] * 3 + 2]), 'b': c4d.Vector(adjusted_uvws[uv_indices[1] * 3], adjusted_uvws[uv_indices[1] * 3 + 1], adjusted_uvws[uv_indices[1] * 3 + 2]), 'a': c4d.Vector(adjusted_uvws[uv_indices[2] * 3], adjusted_uvws[uv_indices[2] * 3 + 1], adjusted_uvws[uv_indices[2] * 3 + 2]) } # Handle quads elif poly_size == 4: uv_dict = { 'd': c4d.Vector(adjusted_uvws[uv_indices[0] * 3], adjusted_uvws[uv_indices[0] * 3 + 1], adjusted_uvws[uv_indices[0] * 3 + 2]), 'c': c4d.Vector(adjusted_uvws[uv_indices[1] * 3], adjusted_uvws[uv_indices[1] * 3 + 1], adjusted_uvws[uv_indices[1] * 3 + 2]), 'b': c4d.Vector(adjusted_uvws[uv_indices[2] * 3], adjusted_uvws[uv_indices[2] * 3 + 1], adjusted_uvws[uv_indices[2] * 3 + 2]), 'a': c4d.Vector(adjusted_uvws[uv_indices[3] * 3], adjusted_uvws[uv_indices[3] * 3 + 1], adjusted_uvws[uv_indices[3] * 3 + 2]) } # Handle ngons (polygons with more than 4 vertices) elif has_ngons: # Sort the vertices properly and create the UV dict dynamically alphabet = 'abcdefghijklmnopqrstuvwxyz' for i in range(poly_size): # Make sure to use the correct UV order key = alphabet[i] if i < len(alphabet) else f'v{i}' # Handle large ngons uv_dict[key] = c4d.Vector( adjusted_uvws[uv_indices[i] * 3], adjusted_uvws[uv_indices[i] * 3 + 1], adjusted_uvws[uv_indices[i] * 3 + 2] ) assembled_uvws.append(uv_dict) handle.SetUVWFromTextureView(assembled_uvws, True, True, True) bodypaint.FreeActiveUVSet(handle) c4d.EventAdd()``` My problem is, it works with a mesh that is only quads and tris or any combination thereof, but if the mesh contains any ngons then I get this result: ![Issue.PNG](/forum/assets/uploads/files/1727982214709-issue.png)
-
@ELJeffery
The image: