ObjectData: draw above everything else

On 31/10/2017 at 11:07, xxxxxxxx wrote:

Hey guys,

is there a way to draw lines or points above everything else? Preferably in object drawpass.
SetMatrix_Matrix(op, m, ZOFFSET) or SetMatrix_Screen(ZOFFSET) has no effect.

Thx and greetings
rownn

On 31/10/2017 at 12:12, xxxxxxxx wrote:

Ok, I think this could be a workaround.

def Draw(self, op, drawpass, bd, bh) :  
  color = op[c4d.ID_BASEOBJECT_COLOR]  
  m = op.GetMg()  
  
  if drawpass==c4d.DRAWPASS_OBJECT:  
      if bh.IsHighlight() :  
         color = c4d.Vector(1,1,1)  
  
      if bh.IsActive() :  
          color = op[c4d.ID_BASEOBJECT_COLOR]  
  
      bd.SetPen(color)  
      bd.SetPointSize(10)  
  
      bd.SetMatrix_Camera()  
      bd.DrawPoints([(m.off*~bd.GetMg()).GetNormalized()*2])  
  
  return c4d.DRAWRESULT_OK

On 01/11/2017 at 05:00, xxxxxxxx wrote:

Here a little update, which consider the different projections except parallel projection.

def Draw(self, op, drawpass, bd, bh) :  
  color = op[c4d.ID_BASEOBJECT_COLOR]  
  m = op.GetMg()  
  ibdMg = ~bd.GetMg()  
  
  if drawpass==c4d.DRAWPASS_OBJECT:  
      if bh.IsHighlight() : color = pencolor+c4d.Vector(0.5)  
  
      bd.SetPen(pencolor)  
      bd.SetPointSize(10)  
  
      projection = bd.GetProjection()  
      bd.SetMatrix_Camera()  
        
      if projection == 0:  
          pos = (m.off*ibdMg).GetNormalized()*2  
          bd.DrawPoints([pos])  
  
      elif projection in (2,3,4,5,6,7) :  
          pos = op.GetMg().off*ibdMg  
          pos.z = -1000000  
          bd.DrawPoints([pos])  
  
  return c4d.DRAWRESULT_OK

On 02/11/2017 at 08:29, xxxxxxxx wrote:

Next little update. In case more than one postion should be drawn there was an issue with overlapping. I don´t thing it is totally fixed now, but works better.

def Draw(self, op, drawpass, bd, bh) :  
  color = op[c4d.ID_BASEOBJECT_COLOR]  
  m = op.GetMg()  
  ibdMg = ~bd.GetMg()  
  
  if drawpass==c4d.DRAWPASS_OBJECT:  
      if bh.IsHighlight() :  
          color = color+c4d.Vector(0.5)  
  
      bd.SetPen(color)  
      bd.SetPointSize(10)  
  
      projection = bd.GetProjection()  
      bd.SetMatrix_Camera()  
        
      if projection == 0:  
          pos = m*ibdMg  
          posFront = pos.GetNormalized()*(2+(pos.z/10000.0))  
          bd.DrawPoints([posFront])  
  
      elif projection in (2,3,4,5,6,7) :  
          pos = op.GetMg()*ibdMg  
          pos.z += -100000  
          bd.DrawPoints([pos])  
  
  return c4d.DRAWRESULT_OK

On 06/11/2017 at 14:53, xxxxxxxx wrote:

Hi rown, thanks for writing us and sorry for the delay in getting back to you.

After researching a bit, and without using 2D drawing methods, slightly extending (and optimizing) your code you can support also isometric and dimetric projections:

  
  def Draw(self, op, drawpass, bd, bh) :  
      color = op[c4d.ID_BASEOBJECT_COLOR]  
      m = op.GetMg()  
      ibdMg = ~bd.GetMg()  
      pos = m.off * ibdMg        
      projection = bd.GetProjection()  
  
      if drawpass == c4d.DRAWPASS_OBJECT:  
          if bh.IsHighlight() :  
              color = color + c4d.Vector(0.5)  
  
          bd.SetPen(color)  
          bd.SetPointSize(10)  
  
          bd.SetMatrix_Camera()  
  
          if projection == 0:  
              pos = pos.GetNormalized() * (2 + (pos.z / 10000.0))  
  
          elif projection in (2, 3, 4, 5, 6, 7, 12, 13) :  
              pos.z += -10000  
  
          bd.DrawPoints([pos])  
  
      return c4d.DRAWRESULT_OK      

Finally the zoffset parameter found in SetMatrix_Matrix() or SetMatrix_Screen() has no real effect because it's not meant to change the depth at which an entity is drawn with respect to another, but it  changes the drawing priority in the z-buffer.

Best, Riccardo