def tool_down(self, event): self._handle = -1 self._moved = False self._bones = self.get_current_bones() for i in range(len(self._bones)): bone = self._bones[i] pos, axis = self.get_world_bone_axis(bone) pos += axis * self._frac scale = Vector.magnitude(axis) / 10.0 eventpos = Vector(event.posRaw[0], event.posRaw[1], event.posRaw[2]) eventaxis = Vector(event.axis[0], event.axis[1], event.axis[2]) # te.axis is normalized # d = |(x2-x1) x (x1-x0)| / |x2-x1| # x2 = eventpos, x1 = eventpos + axis, x0 = pos # (x2-x1) = -axis # (x1-x0) = eventpos+axis - pos # |(x2-x1)| = 1 # (-axis) x (eventpos-pos+axis) d = Vector.magnitude(Vector.cross(-eventaxis, eventpos - pos + eventaxis)) if d <= scale: self._handle = i return 1 return 0
def tool_draw(self, ca): self._bones = self.get_current_bones() cur_time = lwsdk.LWInterfaceInfo().curTime for bone in self._bones: if bone.type == lwsdk.LWBONETYPE_ZAXIS: len = bone.restlength; dir = Vector(0,0,1) ca.setCSysItem(ca.dispData, bone.id); else: pos = self._item_info.param(bone.id, lwsdk.LWIP_POSITION, cur_time) len = Vector.magnitude(pos) dir = pos / len; ca.setCSysItem(ca.dispData, bone.parent); ca.setDrawMode(ca.dispData, 8 + 4) q1 = Vector(-0.1,-0.1,0) q2 = Vector( 0.1,-0.1,0) q3 = Vector( 0.1, 0.1,0) q4 = Vector(-0.1, 0.1,0) q1 += dir * self._frac q1 *= len q2 += dir * self._frac q2 *= len q3 += dir * self._frac q3 *= len q4 += dir * self._frac q4 *= len # color can be a lwsdk.Vector, lwsdk.Color or a Python sequence ca.setColor(ca.dispData, [1.0, 0.3, 0.1, 1.0]) ca.line(ca.dispData, q1, q2, lwsdk.LWCSYS_OBJECT) ca.line(ca.dispData, q2, q3, lwsdk.LWCSYS_OBJECT) ca.line(ca.dispData, q3, q4, lwsdk.LWCSYS_OBJECT) ca.line(ca.dispData, q4, q1, lwsdk.LWCSYS_OBJECT) ca.line(ca.dispData, q1, q3, lwsdk.LWCSYS_OBJECT) ca.line(ca.dispData, q2, q4, lwsdk.LWCSYS_OBJECT) ca.setColor(ca.dispData, [1.0, 0.3, 0.1, 0.2]) ca.quad(ca.dispData, q1, q2, q3, q4, lwsdk.LWCSYS_OBJECT)