Creating a NormalTag?



  • On 17/04/2017 at 10:24, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   R13 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    Hi,

    I'm having trouble creating a proper NormalTag on my polygon objects.
    When I add the new tag. The object is filled with tiny little lines. It looks like OpenGL is freaking out or something.
    I think this is happening because I have not set the tag data. But I'm having trouble figuring out use the Set() function.
    Can someone please post a working example?

    Thanks,
    -ScottA



  • On 18/04/2017 at 02:43, xxxxxxxx wrote:

    Hi Scott,

    please check out the NormalTag manual, I think it should contain everything you need.



  • On 18/04/2017 at 07:49, xxxxxxxx wrote:

    Thanks Andreas. That helped me out a lot.

    This is the code version I added to my notes:

    //This is how to create a new normals tag on a polygon object  
        
      PolygonObject *pobj = (PolygonObject* )doc->GetActiveObject();  
      if (!pobj || pobj->GetType() != Opolygon) return false;    
      
      CPolygon *polys = pobj->GetPolygonW();  
      LONG polyCount = pobj->GetPolygonCount();  
      
      //Get the NormalTag on the object  
      NormalTag *normalTag = static_cast<NormalTag*>(pobj->GetTag(Tnormal));      
      
      //If the object doesn't already have a normals tag on it...we add a new tag  
      //NOTE: At this point the object will look very bad...filled with tiny openGL lines!!  
      if (!normalTag)  
      {  
          normalTag = NormalTag::Alloc(pobj->GetPolygonCount());  
          if(normalTag)  
          {  
              pobj->InsertTag(normalTag);  
              EventAdd();  
          }  
      }  
      
      /////////////////////////////////////////////////////////////////////////////////////  
      //To fix this uglyness   
      //We need to get the normal vectors of the object and store them in the new NormalTag  
      /////////////////////////////////////////////////////////////////////////////////////  
      
      //First make sure there is a phong tag on the object  
      if (!pobj->GetTag(Tphong)) pobj->MakeTag(Tphong);  
      
      //Get and store the polygon vectors in the new NormalTag so it doesn't look ugly anymore  
      NormalHandle handle = normalTag->GetDataAddressW();  
      for (LONG i = 0; i < polyCount; ++i)  
      {  
          const CPolygon polygon = polys[i];  
      
          //Calculate the default face normals  
          Vector normal = CalcFaceNormal(pobj->GetPointR(), polygon);  
          NormalStruct normals;   
      
          //Save the normals data in the NormalTag  
          normals.a = normal;  
          normals.b = normal;  
          normals.c = normal;  
          normals.d = normal;  
          NormalTag::Set(handle, i, normals);  
      }  
      pobj->Message(MSG_UPDATE);
    

    -ScottA


Log in to reply