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

    Relations: BaseObject,RayObject,OPolygon [SOLVED]

    SDK Help
    0
    23
    14.6k
    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.
    • H
      Helper
      last edited by

      On 17/10/2014 at 21:17, xxxxxxxx wrote:

      Hmm... I don't want to be mean, but from what I wrote in the whole thread, it should be clear, that there is no way to dynamic cast a RayObject to anything else, because there is no inheritance hierarchy.

      And as we discussed earlier, it is not possible to get to the polygons of a O_SPHERE, because it has none, so my plan was to export a polygonized version of the Osphere (!) which is a BaseObject, not a RayObject. The problem is that I don't have the link to the original object, so I cannot tell if a O_POLYGON RayObject was a sphere originally, in which case I would not have to do the cloning thing.

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 17/10/2014 at 21:19, xxxxxxxx wrote:

        Oh, and yes I could check the sphere in the object hierarchy for deformers, but I would have to be sure that this is the one and only thing where C4D transforms a parametric sphere into a polyogonized version automatically. There might be tags or other mechanisms that do the same. So if I cannot guarantee that only deformers do that, my code will not be stable in any circumstances.

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 18/10/2014 at 02:57, xxxxxxxx wrote:

          well sorry for this 🙂, wasn't reading the whole thread, now I understand a little more about how they inherit

          about:
          "So it's simple: When I disable the deformers, the spheres are O_SPHERE and when I enable them they are O_POLYGON.

          This behavior is really understandable, but I must find a way to work around it. Everything would be solved if I could get a link to the original object in the hierarchy. Then I would know that a O_POLYGON was originally a sphere, so I could tell my own algorithm that it should not export the sphere (by cloning, baking,...) because it already was transformed by C4D for me."

          I sense I don't understand this part, if there is no deformers, then it will be O_SPHERE , where you will handle it by your own methods, now if there is deformers, then it will be O_POLYGON with all of its data ready for you, I can't figure out where is the problem here "may be I'm missing something"

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 18/10/2014 at 03:08, xxxxxxxx wrote:

            unless you want to process the O_SPHERE as triangles, and from this thread I can see that Cinema 4D won't give you this data

            a possible solution, is to compare all O_SPHERE objects with the object hierarchy "spheres" transformation matrix 4x4 + radius, so you can guarantee that they are exactly the same object (but this may fail if you have multiple spheres with the same radius at the same location, where they have different types "e.g. Tetrahedron, ..." but this seems to be a near impossible case)

            another solution (which would be much better!!) , is:loop over all spheres on object hierarchy, and turn off "render perfect" , I think this should force them to be O_POLYGON

            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              On 19/10/2014 at 12:43, xxxxxxxx wrote:

              Regarding the deformers, I posted my thoughts above:
              "Oh, and yes I could check the sphere in the object hierarchy for deformers, but I would have to be sure that this is the one and only thing where C4D transforms a parametric sphere into a polyogonized version automatically." 😉

              The hint about "render perfect" sounds promising. I will try that tomorrow! 🙂

              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

                On 20/10/2014 at 05:38, xxxxxxxx wrote:

                Hey Mohamed, thanks a lot, it works! 🙂

                Here's the code I use now to treat spheres as PolygonObjects. When "render perfect" is turned off, they are all converted to O_POLYGON RayObjects, so the rest of my code works as is 🙂

                // for each BaseObject in hierarchy:
                if (pObject->GetType() == Osphere)
                {
                    BaseContainer* baseContainer = pObject->GetDataInstance();
                    if (baseContainer != nullptr)
                    {
                        bool renderPerfect = baseContainer->GetBool(PRIM_SPHERE_PERFECT);
                  
                        if (renderPerfect)
                        {
                            GePrint("Parametric sphere found! Turing off \"render perfect\"!");
                            baseContainer->SetBool(PRIM_SPHERE_PERFECT, false);
                        }
                    }
                }
                

                Thanks again, this made my day!

                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

                  On 20/10/2014 at 06:02, xxxxxxxx wrote:

                  glad that it worked 😉 , but when do you call this function? "I think I will face the same problem at some point in my render engine, and I need to call the function before Cinema 4D data filling"

                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

                    On 21/10/2014 at 03:14, xxxxxxxx wrote:

                    I call it in the Execute function of my VideoPostData plugin:

                    RENDERRESULT MyVideoPostDataPlugin::Execute(BaseVideoPost* node, VideoPostStruct* vps)
                    { if (vps->error == nullptr || *vps->error != RENDERRESULT_OK || vps->thread->TestBreak()) { return RENDERRESULT_OK; } if (vps->vp == VIDEOPOSTCALL_FRAMESEQUENCE && vps->open) { C4dHelper::foreachObjectInHierarchy(vps->doc, vps->doc->GetFirstObject(), [&](BaseObject* pObject) -> bool { if (pObject->GetType() != Osphere) return true; BaseContainer* baseContainer = pObject->GetDataInstance(); if (baseContainer == nullptr) return true; if (!baseContainer->GetBool(PRIM_SPHERE_PERFECT)) return true; GePrint("Parametric sphere found! Turing off \"render perfect\"!"); baseContainer->SetBool(PRIM_SPHERE_PERFECT, false); return true; }); return RENDERRESULT_OK; } if (vps->vp == VIDEOPOSTCALL_INNER && vps->open) { // RayObjects of type O_SPHERE should not have been created now, // instead they are of type O_POLYGON return RENDERRESULT::RENDERRESULT_OK; } return RENDERRESULT::RENDERRESULT_OK; }
                    
                    1 Reply Last reply Reply Quote 0
                    • H
                      Helper
                      last edited by

                      On 21/10/2014 at 04:25, xxxxxxxx wrote:

                      well thanks a lot 🙂, but I'm kinda confused now, what I understand is that videopost plugin is called "after" Cinema 4D ray object filling, so how this is working before the filling?

                      1 Reply Last reply Reply Quote 0
                      • H
                        Helper
                        last edited by

                        On 21/10/2014 at 06:21, xxxxxxxx wrote:

                        Search in the docu for these flags:
                        * VIDEOPOSTCALL_FRAMESEQUENCE
                        * VIDEOPOSTCALL_INNER

                        There are some more of those, where each is called in a fixed order with an open or close bool.

                        Execute is called for each step in the rendering pipeline twice. The VIDEOPOSTCALL_FRAMESEQUENCE is the first one before a rendering starts and before C4D performs any computations. VolumeData, for example, is not ready in this state, so setting the "render perfect" works 🙂

                        1 Reply Last reply Reply Quote 0
                        • H
                          Helper
                          last edited by

                          On 21/10/2014 at 06:24, xxxxxxxx wrote:

                          oh , thanks a lot for clarification 🙂

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