feat: progress on draw

This commit is contained in:
Swann
2019-08-13 21:32:15 +02:00
parent b8e47a676e
commit 2bb3939629
7 changed files with 165 additions and 19 deletions

View File

@ -4,22 +4,22 @@ import mathutils
from .. import utils from .. import utils
from ..presence import User from ..presence import User
from ..libs.replication.data import ReplicatedDatablock from ..libs.replication.data import ReplicatedDatablock
from ..libs.debug import draw_point
class BlUser(ReplicatedDatablock): class BlUser(ReplicatedDatablock):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__( *args, **kwargs) super().__init__( *args, **kwargs)
self.icon = 'CON_ARMATURE' self.icon = 'CON_ARMATURE'
#TODO: investigate on empty buffer...
if self.buffer: if self.buffer:
self.load(self.buffer, self.pointer) self.load(self.buffer, self.pointer)
def construct(self, name): def construct(self, name):
return User() return User()
def load(self, data, target): def load(self, data, target):
# target.name = data['name'] target.name = data['name']
target.location = data['location']
utils.dump_anything.load(target, data) utils.dump_anything.load(target, data)
def dump(self,pointer=None): def dump(self,pointer=None):

View File

@ -1,6 +1,8 @@
import bpy import bpy
from .libs.replication.constants import * from .libs.replication.constants import *
from .libs import debug
from . import operators from . import operators
from .bl_types.bl_user import BlUser
class Delayable(): class Delayable():
def register(self): def register(self):
@ -33,7 +35,10 @@ class Timer(Delayable):
def unregister(self): def unregister(self):
"""Unnegister the timer of the blender timer system """Unnegister the timer of the blender timer system
""" """
bpy.app.timers.unregister(self.execute) try:
bpy.app.timers.unregister(self.execute)
except:
print("timer already unregistered")
class ApplyTimer(Timer): class ApplyTimer(Timer):
def __init__(self, timout=1,target_type=None): def __init__(self, timout=1,target_type=None):
@ -64,9 +69,12 @@ class Draw(Delayable):
raise NotImplementedError() raise NotImplementedError()
def unregister(self): def unregister(self):
bpy.types.SpaceView3D.draw_handler_remove( try:
self._handler, "WINDOW") bpy.types.SpaceView3D.draw_handler_remove(
self._handler, "WINDOW")
except:
print("draw already unregistered")
class ClientUpdate(Draw): class ClientUpdate(Draw):
def __init__(self, client_uuid=None): def __init__(self, client_uuid=None):
assert(client_uuid) assert(client_uuid)
@ -75,5 +83,16 @@ class ClientUpdate(Draw):
def execute(self): def execute(self):
if hasattr(operators,"client"): if hasattr(operators,"client"):
operators.client.get(self._client_uuid).pointer.update_location() client = operators.client.get(self._client_uuid)
print("update! ")
if client:
client.pointer.update_location()
class DrawClients(Draw):
def execute(self):
if operators.client:
users = operators.client.list(filter=BlUser)
[debug.draw_point(location=operators.client.get(u).buffer['location']) for u in users if operators.client.get(u)]

125
libs/debug.py Normal file
View File

@ -0,0 +1,125 @@
import bpy
import bgl
import gpu
from gpu_extras.batch import batch_for_shader
import numpy
DEFAULT_COORDS = [(0.0, 0.0, 0.0)]
DEFAULT_INDICES = [(0)]
def refresh_viewport():
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
class Drawable():
"""Drawable base class in charge to hanfle the drawing pipline.
:param coords: list of vertices
:type coords: list of tuples. ex: [(x,y,z),...]
:param indices: list of vertices index to structure geometry
:type indices: list of tuples.
:param location: suited location in world space.
:type location: tuple, (x,y,z)
:param mode: primitive drawing mode.
:type mode: string in ['POINTS','LINES','TRIS'], default: "POINTS".
:param color: primitive color
:type color: tuple, (r,g,b,a)
:param duration: lifetime of the primitive in seconds
:type duration: float
"""
def __init__(self, coords=DEFAULT_COORDS, indices=DEFAULT_INDICES, location=(0.0, 0.0, 0.0), mode='POINTS', color=(1, 0, 0, 1), duration=1):
self._duration = duration
self._color = color
self._coord = [tuple(numpy.add(c,location)) for c in coords]
self.shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
self.batch = batch_for_shader(
self.shader, mode, {"pos": self._coord}, indices=indices)
# Bind the drawing function
self._handler = bpy.types.SpaceView3D.draw_handler_add(
self.draw, (), 'WINDOW', 'POST_VIEW')
# Bind the callback
self._timer = bpy.app.timers.register(
self.clear, first_interval=duration)
def draw(self):
self.shader.bind()
self.shader.uniform_float("color", self._color)
self.batch.draw(self.shader)
def clear(self):
"""Remove the drawable object from the viewport
"""
bpy.types.SpaceView3D.draw_handler_remove(self._handler, 'WINDOW')
def draw_point(location=(0, 0, 0), color=(1, 0, 0, 1), duration=1):
"""Draw a point
:param location: suited location in world space.
:type location: tuple, (x,y,z)
:param color: primitive color
:type color: tuple, (r,g,b,a)
:param duration: lifetime of the primitive in seconds
:type duration: float
"""
return Drawable(location=location, color=color, duration=duration)
def draw_line(a=(0, 0, 0), b=(0, 1, 0), color=(1, 0, 0, 1), duration=1):
""" Draw a line from a given point A to the point B.
:param a: point A location in world space.
:type a: tuple, (x,y,z)
:param b: point B location in world space.
:type b: tuple, (x,y,z)
:param color: primitive color
:type color: tuple, (r,g,b,a)
:param duration: lifetime of the primitive in seconds
:type duration: float
"""
return Drawable(coords=[a, b], indices=[(0, 1)], mode='LINES', color=color, duration=duration)
def draw_cube(radius=1, location=(0, 0, 0), color=(1, 0, 0, 1), duration=1):
""" Draw a cube.
:param radius: size of the cube.
:type radius: float
:param location: suited location in world space.
:type location: tuple, (x,y,z)
:param color: primitive color
:type color: tuple, (r,g,b,a)
:param duration: lifetime of the primitive in seconds
:type duration: float
"""
coords = (
(-radius, -radius, -radius), (+radius, -radius, -radius),
(-radius, +radius, -radius), (+radius, +radius, -radius),
(-radius, -radius, +radius), (+radius, -radius, +radius),
(-radius, +radius, +radius), (+radius, +radius, +radius))
indices = (
(0, 1), (0, 2), (1, 3), (2, 3),
(4, 5), (4, 6), (5, 7), (6, 7),
(0, 4), (1, 5), (2, 6), (3, 7))
return Drawable(coords=coords, mode='LINES', indices=indices, location=location, color=color, duration=duration)
def draw_custom(coords=DEFAULT_COORDS, indices=DEFAULT_INDICES, mode='LINES',location=(0, 0, 0), color=(1, 0, 0, 1), duration=1):
""" Draw a user defined polygon shape.
:param coords: list of vertices
:type coords: list of tuples. ex: [(x,y,z),...]
:param indices: list of vertices index to structure geometry
:type indices: list of tuples.
:param location: suited location in
:param color: primitive color
:type color: tuple, (r,g,b,a)
:param duration: lifetime of the primitive in seconds
:type duration: float
"""
return Drawable(coords=coords, indices=indices, mode=mode, location=location, color=color, duration=duration)

View File

@ -124,16 +124,12 @@ class SessionStartOperator(bpy.types.Operator):
) )
settings.user_uuid = client.add(usr) settings.user_uuid = client.add(usr)
delayables.append(delayable.DrawClients())
delayables.append(delayable.ClientUpdate(client_uuid=settings.user_uuid)) delayables.append(delayable.ClientUpdate(client_uuid=settings.user_uuid))
# Push all added values # Push all added values
client.push() client.push()
# settings.is_running = True
# bpy.ops.session.refresh()
# register_ticks()
# Launch drawing module # Launch drawing module
# if settings.enable_presence: # if settings.enable_presence:
# presence.renderer.run() # presence.renderer.run()
@ -162,6 +158,8 @@ class SessionStopOperator(bpy.types.Operator):
for d in delayables: for d in delayables:
d.unregister() d.unregister()
# del client_instance # del client_instance
# unregister_ticks() # unregister_ticks()

View File

@ -7,9 +7,12 @@ import mathutils
from bpy_extras import view3d_utils from bpy_extras import view3d_utils
from gpu_extras.batch import batch_for_shader from gpu_extras.batch import batch_for_shader
# from .libs import debug
# from .bl_types.bl_user import BlUser
# from .delayable import Draw
global renderer global renderer
def view3d_find(): def view3d_find():
for area in bpy.data.window_managers[0].windows[0].screen.areas: for area in bpy.data.window_managers[0].windows[0].screen.areas:
if area.type == 'VIEW_3D': if area.type == 'VIEW_3D':

3
ui.py
View File

@ -163,6 +163,7 @@ class SESSION_PT_user(bpy.types.Panel):
area_msg = col.row(align = True) area_msg = col.row(align = True)
item_box = area_msg.box() item_box = area_msg.box()
client = operators.client.get(key).buffer client = operators.client.get(key).buffer
pointer = operators.client.get(key).pointer
info = "" info = ""
detail_item_row = item_box.row(align = True) detail_item_row = item_box.row(align = True)
@ -177,7 +178,7 @@ class SESSION_PT_user(bpy.types.Panel):
detail_item_row.label( detail_item_row.label(
text="{} {}".format(username, info)) text="{} {}".format(username, info))
detail_item_row.label(text=str(pointer))
if not is_local_user: if not is_local_user:
detail_item_row.operator( detail_item_row.operator(
"session.snapview", text="", icon='VIEW_CAMERA').target_client = key "session.snapview", text="", icon='VIEW_CAMERA').target_client = key