@@ -378,41 +378,96 @@ end
378378
379379# ####################################################
380380
381+ struct MeshFromFile{M} # used for urdf/rson parsing/serializing
382+ mesh:: M
383+ path:: String
384+ end
385+
381386struct Visual{G, FID} <: ComponentData{Float64}
382387 frame:: FID
388+ transform:: Union{Nothing, Transform{Float64}}
383389 geometry:: G
384390 color:: RGBAf
385391 specular:: Float32
386392 shininess:: Float32
387- function Visual (frame, geometry; color= RGBAf (1.0f0 , 0.0f0 , 1.0f0 , 1.0f0 ), specular= 0.2f0 , shininess= 32.0f0 )
393+ function Visual (frame, transform, geometry; color= RGBAf (1.0f0 , 0.0f0 , 1.0f0 , 1.0f0 ), specular= 0.2f0 , shininess= 32.0f0 )
388394 if isa (geometry, GeometryBasics. GeometryPrimitive)
389- _mesh = GeometryBasics. normal_mesh (geometry)
395+ # _mesh = GeometryBasics.normal_mesh(geometry)
396+ new {typeof(geometry), typeof(frame)} (frame, transform, geometry, color, specular, shininess)
390397 elseif isa (geometry, GeometryBasics. Mesh)
398+ _mesh = GeometryBasics. normal_mesh (geometry)
399+ new {typeof(_mesh), typeof(frame)} (frame, transform, _mesh, color, specular, shininess)
400+ elseif isa (geometry, MeshFromFile{<: GeometryBasics.Mesh })
391401 _mesh = geometry
402+ new {typeof(_mesh), typeof(frame)} (frame, transform, _mesh, color, specular, shininess)
403+ elseif isa (geometry, MeshFromFile{DAEScene})
404+ new {typeof(geometry), typeof(frame)} (frame, transform, geometry, color, specular, shininess)
392405 else
393- error (" Invalid geometry type: $(typeof (geometry)) " )
406+ error (" Unrecognized geometry type: $(typeof (geometry)) " )
394407 end
395- new {typeof(_mesh), typeof(frame)} (frame, _mesh, color, specular, shininess)
396408 end
397409
398- function Visual (name, color, geometry)
399- # legacy constructor
400- Visual (name, geometry; color= color)
401- end
410+ # function Visual(name, color, geometry)
411+ # # legacy constructor
412+ # Visual(name, geometry; color=color)
413+ # end
402414
403- function Visual (name, frame, color, geometry)
404- @warn " Visual(name, frame, color, geometry) is deprecated. Use Visual(frame, color, geometry) instead."
405- Visual (frame, color, geometry)
406- end
407- # Keyword constructor
408- Visual (; frame, geometry, color, specular, shininess) = Visual (frame, geometry; color= color , specular= specular, shininess = shininess)
415+ # function Visual(name, frame, color, geometry)
416+ # @warn "Visual(name, frame, color, geometry) is deprecated. Use Visual(frame, color, geometry) instead."
417+ # Visual(frame, color, geometry)
418+ # end
419+ # # Keyword constructor
420+ Visual (; frame, transform, geometry, color, specular, shininess) = Visual (frame, transform, geometry; color, specular, shininess)
409421end
410422
411423function Base.:* (tf:: Transform , v:: Visual )
412- Visual (v. frame, v. color, VMRobotControl. transform_mesh (v. geometry, tf))
424+ if isnothing (v. transform)
425+ remake (v; transform= tf)
426+ else
427+ remake (v; transform= tf* v. transform)
428+ end
413429end
414430
415-
416431_reassign_frames (c:: Visual , frd) = remake (c; frame= get_compiled_frameID (frd, c. frame))
417432_reassign_joints (c:: Visual , jrd) = c
418433_reassign_coords (c:: Visual , crd) = c
434+
435+ struct CompiledVisual{M<: GeometryBasics.Mesh } <: ComponentData{Float64}
436+ frame:: FrameID
437+ mesh:: M
438+ color:: RGBAf
439+ specular:: Float32
440+ shininess:: Float32
441+ end
442+
443+ function compile_visual (v:: Visual )
444+ if isa (v. geometry, MeshFromFile{DAEScene})
445+ # If the geometry is a DAE scene, load it
446+ meshes_kwargs = convert_for_glmakie (v. geometry. mesh)
447+ return [
448+ begin
449+ color = haskey (kwargs, :color ) ? kwargs[:color ] : v. color
450+ specular = haskey (kwargs, :specular ) ? kwargs[:specular ] : v. specular
451+ shininess = haskey (kwargs, :shininess ) ? kwargs[:shininess ] : v. shininess
452+ _mesh = convert (GeometryBasics. GLNormalMesh{3 }, mesh)
453+ transformed_mesh = VMRobotControl. transform_mesh (_mesh, v. transform)
454+ M = typeof (transformed_mesh)
455+ CompiledVisual {M} (v. frame, transformed_mesh, color, specular, shininess)
456+ end
457+ for (mesh, kwargs) in meshes_kwargs
458+ ]
459+ end
460+
461+ if isa (v. geometry, MeshFromFile{<: GeometryBasics.Mesh })
462+ # If the geometry is a mesh from file, load it
463+ mesh = normal_mesh (v. geometry. mesh)
464+ elseif isa (v. geometry, GeometryBasics. GeometryPrimitive)
465+ # Otherwise, use the geometry as is
466+ mesh = normal_mesh (v. geometry)
467+ elseif isa (v. geometry, GeometryBasics. Mesh)
468+ mesh = normal_mesh (v. geometry)
469+ else
470+ error (" Unrecognized geometry type: $(typeof (v. geometry)) " )
471+ end
472+ CompiledVisual (v. frame, mesh, v. color, v. specular, v. shininess)
473+ end
0 commit comments