-
-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy path__init__.py
More file actions
99 lines (77 loc) · 3.11 KB
/
Copy path__init__.py
File metadata and controls
99 lines (77 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# outer __init__.py
from .vera import *
import importlib
bpy_found = importlib.util.find_spec("bpy")
def toBlenderImage(_name, _image,
float_buffer=True, alpha=True, alpha_mode='STRAIGHT', file_format='PNG'):
if bpy_found is None:
raise Exception('vera.toBlenderImage() requires Blender enviroment')
import bpy
from itertools import chain
if _name in bpy.data.images:
bimage = bpy.data.images[_name]
else:
bimage = bpy.data.images.new( _name,
_image.getWidth(), _image.getHeight(),
float_buffer=float_buffer, alpha=alpha)
bimage.alpha_mode = alpha_mode
bimage.file_format = file_format
def feedGrayscalePixels(img):
for y in range(img.getHeight()):
for x in range(img.getWidth()):
v = img.getValue( img.getIndex(x,y) )
yield v, v, v, 1.0
def feedColorPixels(img):
for y in range(img.getHeight()):
for x in range(img.getWidth()):
v = img.getColor( img.getIndex(x,y) )
yield v[0], v[1], v[2], v[3]
if _image.getChannels() == 1:
bimage.pixels = tuple(chain.from_iterable(feedGrayscalePixels(_image)))
else:
bimage.pixels = tuple(chain.from_iterable(feedColorPixels(_image)))
bimage.update()
def toBlenderMesh(_name, _mesh, _collection_name="Collection"):
if bpy_found is None:
raise Exception('vera.toBlendermesh() requires Blender enviroment')
import bpy
if _name in bpy.data.meshes:
bmesh = bpy.data.meshes[_name]
bmesh.clear_geometry()
else:
bmesh = bpy.data.meshes.new(_name)
obj = bpy.data.objects.new(bmesh.name, bmesh)
col = bpy.data.collections.get(_collection_name)
col.objects.link(obj)
bpy.context.view_layer.objects.active = obj
verts = []
faces = []
edges = []
for v in _mesh.getVertices():
verts.append( (v.x, v.y, v.z) )
for t in _mesh.getTrianglesIndices():
faces.append( (t.x, t.y, t.z ) )
for e in _mesh.getLinesIndices():
edges.append( (e.x, e.y) )
bmesh.from_pydata(verts, edges, faces)
# Texture coordinates per vertex *per polygon loop*.
# Create UV coordinate layer and set values
if _mesh.haveTexCoords():
uv_layer = bmesh.uv_layers.new()
for i, uv in enumerate(uv_layer.data):
st = _mesh.getTexCoord( _mesh.getFaceIndex(i) )
uv.uv = [st.x, st.y]
# Vertex color per vertex *per polygon loop*
# Create vertex color layer and set values
if _mesh.haveColors():
vcol_lay = bmesh.vertex_colors.new()
for i, col in enumerate(vcol_lay.data):
color = _mesh.getColor( _mesh.getFaceIndex(i) )
col.color[0] = color[0]
col.color[1] = color[1]
col.color[2] = color[2]
col.color[3] = color[3]
# We're done setting up the mesh values, update mesh object and
# let Blender do some checks on it
bmesh.update()
bmesh.validate()