Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    MoGraph color tag access

    Cinema 4D SDK
    c++
    2
    4
    761
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Aaron
      last edited by

      Hello colleagues,
      Ho can we access the color of MoGraph data for each object where Motion Graphics Color Tag [with tag->GetType() = 1018768] is assigned?

      For example there is Text object or Voronoi Fracture object which have these tags for generated child objects.

      Thanks in advance!

      1 Reply Last reply Reply Quote 0
      • M
        m_adam
        last edited by m_adam

        Hi you tagged as C++ but we do have this example in python, demonstrating two ways and the first one is by reading the modata stored in the mograph object.

        Cheers,
        Maxime.

        MAXON SDK Specialist

        Development Blog, MAXON Registered Developer

        A 1 Reply Last reply Reply Quote 0
        • A
          Aaron @m_adam
          last edited by

          Hi @m_adam Maxime,
          I don't understand yet, how to use the Python example within a C++ environment. Can't find C++ functions such as this:

          md = c4d.modules.mograph.GeGetMoData(op)
          ... 
          offset = op[c4d.MG_LINEAR_OFFSET]
          

          I have noticed that for example the Text object type has MoData->GetCount() with N elements corresponding to the number of letters. And then the cache object of Text has N children each with Motion Graphics Color Tag [tag->GetType() = 1018768].
          I thought there could be a way to read this color tag somehow.

          But if no then during scene traversal there is a way to inherit the array of the Text object with MoData->GetCount() > 0 and then count each descendant object with Motion Graphics Color Tag with increasing id to reference to the correct element of MoData->GetArray()

          Same extraction can be done for Voronoi Fracture and other MoGraph objects with some checks.

          1 Reply Last reply Reply Quote 0
          • M
            m_adam
            last edited by m_adam

            Hi @Aaron sorry I have to admit I totally overlooked your case.

            So Fracture Object is a bit special in how color is handled, and this is not as an usual mograph object, where there is Modata and an array of color. Instead each part is a different PolygonObject and the color is simply the color of the object (the one from the basic tab when you select a polygon object in the attribute manager). So with that said find bellow a code to read color.

            // Get the fracture object
            BaseObject* obj = doc->GetFirstObject();
            if (!obj && obj->GetType() == 1036557)
            	return false;
            
            // Retrieve the cache. The Cache of a fracture object consist of a null and a bunch of PolygonObject where
            // each PolygonObject represents a part of the fracture.
            BaseObject* rootObjCache = obj->GetCache();
            if (!rootObjCache)
            	return false;
            
            BaseObject* child = rootObjCache->GetDown();
            Random randomGenerator = Random();
            while (child)
            {
            	// Read Color
            	GeData data;
            	child->GetParameter(DescID(ID_BASEOBJECT_COLOR), data, DESCFLAGS_GET::NONE);
            	Vector color = data.GetVector();
            	ApplicationOutput("@"_s, color);
            
            	// Write Color with new random value, note that we write the cache, meaning each new re-evaluation of the Fracture object will reset these changes
            	Vector randomColor = Vector(randomGenerator.Get01(), randomGenerator.Get01(), randomGenerator.Get01());
            	child->SetParameter(DescLevel(ID_BASEOBJECT_COLOR), randomColor, DESCFLAGS_SET::NONE);
            
            	// Get Next Polygon Object aka the next part from the fracture
            	child = child->GetNext();
            }
            

            Cheers,
            Maxime.

            MAXON SDK Specialist

            Development Blog, MAXON Registered Developer

            1 Reply Last reply Reply Quote 0
            • First post
              Last post