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 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