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


Log in to reply