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