Created
January 7, 2016 12:05
-
-
Save zeffii/a49e3e73addd572fd4f2 to your computer and use it in GitHub Desktop.
slow mesh lattice skin operator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
bl_info = { | |
"name": "New Lattice Object", | |
"author": "Dealga McArdle", | |
"version": (1, 0), | |
"blender": (2, 76, 0), | |
"location": "View3D > Add > Mesh > New Lattice Object", | |
"description": "Adds a new Lattice Object", | |
"category": "Add Mesh", | |
} | |
import bpy | |
from bpy.types import Operator | |
from bpy.props import FloatVectorProperty | |
from bpy.props import FloatProperty | |
from bpy.props import BoolProperty | |
from bpy.props import IntProperty | |
from bpy_extras.object_utils import AddObjectHelper, object_data_add | |
from mathutils import Vector | |
import bmesh | |
def sv_main(self): | |
grid_x = self.grid_x | |
grid_y = self.grid_y | |
grid_z = self.grid_z | |
div_x = self.div_x | |
div_y = self.div_y | |
div_z = self.div_z | |
grid_scale = self.grid_scale | |
verts_out = [] | |
edges_out = [] | |
grid_x = abs(grid_x) | |
grid_y = abs(grid_y) | |
grid_z = abs(grid_z) | |
div_x = max(2, div_x) | |
div_y = max(2, div_y) | |
div_z = max(2, div_z) | |
start_x = -grid_x / 2 | |
start_y = -grid_y / 2 | |
start_z = -grid_z / 2 | |
seg_x = grid_x / (div_x - 1) | |
seg_y = grid_y / (div_y - 1) | |
seg_z = grid_z / (div_z - 1) | |
for i in range(div_z): | |
for j in range(div_x): | |
for k in range(div_y): | |
x = start_x + (seg_x * j) | |
y = start_y + (seg_y * k) | |
z = start_z + (seg_z * i) | |
verts_out.append([x, y, z]) | |
if verts_out: | |
xy = (div_x) * (div_y) | |
limit = (xy * (div_z)) - xy | |
x_limit = xy * div_z | |
''' make z axis ''' | |
for e in range(limit): | |
edges_out.append([e, e+xy]) | |
''' make x axis ''' | |
m = [((div_x * div_y) - div_y) + i for i in range(0, div_x*div_y*div_z, div_x*div_y)] | |
x_excluder = [] | |
for i in m: | |
x_excluder.extend(list(range(i, i+div_y, 1))) | |
for e in range(x_limit): | |
if not e in x_excluder: | |
edges_out.append([e, e+div_y]) | |
''' make y axis ''' | |
last_y = (xy * div_z) - 1 | |
y_excluder = set(range(div_y-1, last_y, div_y)) | |
for j in range(last_y): | |
if not j in y_excluder: | |
edges_out.append([j, j+1]) | |
return verts_out, edges_out | |
def reset(mesh): | |
bm = bmesh.new() # create an empty BMesh | |
bm.from_mesh(mesh) # fill it in from a Mesh | |
bm.clear() | |
bm.to_mesh(mesh) | |
mesh.update() # now an empty mesh | |
return mesh | |
def add_object(self, context): | |
objects = bpy.data.objects | |
meshes = bpy.data.meshes | |
verts, edges = sv_main(self) | |
base_grid_name = self.base_name | |
# print(hash(self)) | |
if base_grid_name in meshes: | |
mesh = meshes.get(base_grid_name) | |
mesh = reset(mesh) | |
else: | |
mesh = bpy.data.meshes.new(name=base_grid_name) | |
mesh.from_pydata(verts, edges, []) | |
object_data_add(context, mesh, operator=self) | |
obj = context.active_object | |
if obj and mesh and self.use_skin_modifier: | |
grid_scale = self.grid_scale | |
obj.modifiers.new('skin', 'SKIN') | |
num_verts = len(obj.data.vertices) | |
flat_list = list((grid_scale,) * (2 * num_verts)) | |
grid_scale = max(0.001, grid_scale) | |
grid_scale = min(0.5, grid_scale) | |
mesh.skin_vertices[0].data.foreach_set("radius", flat_list) | |
mesh.update() | |
class OBJECT_OT_add_object(Operator, AddObjectHelper): | |
"""Create a new Lattice Object""" | |
bl_idname = "mesh.add_lattice_object" | |
bl_label = "Add Lattice Mesh Object" | |
bl_options = {'REGISTER', 'UNDO'} | |
grid_x = FloatProperty(default=3.0, min=0.01) | |
grid_y = FloatProperty(default=4.0, min=0.01) | |
grid_z = FloatProperty(default=5.0, min=0.01) | |
div_x = IntProperty(default=3, min=2) | |
div_y = IntProperty(default=4, min=2) | |
div_z = IntProperty(default=5, min=2) | |
grid_scale = FloatProperty(default=0.01, min=0.001) | |
use_skin_modifier = BoolProperty() | |
def execute(self, context): | |
add_object(self, context) | |
return {'FINISHED'} | |
def invoke(self, context, event): | |
self.base_name = 'rawrrr' | |
return self.execute(context) | |
# Registration | |
def add_object_button(self, context): | |
self.layout.operator( | |
OBJECT_OT_add_object.bl_idname, | |
text="Add Lattice Object", | |
icon='PLUGIN') | |
def register(): | |
bpy.utils.register_class(OBJECT_OT_add_object) | |
bpy.types.INFO_MT_mesh_add.append(add_object_button) | |
def unregister(): | |
bpy.utils.unregister_class(OBJECT_OT_add_object) | |
bpy.types.INFO_MT_mesh_add.remove(add_object_button) | |
if __name__ == "__main__": | |
register() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment