from os import path
from math import pi, tan
import bpy
from mathutils import Vector
from . import laserBeam as lb
from . import userProcess as userProc
from . import illumination as illum
from . import utils
[docs]
class ThumbProcess:
def __init__(self, context):
ui_laser = context.scene.ilsp_laser
self._domainObj = self._addDomain()
self._camera = self._addCamera()
self._process = userProc.UserProcess(ilspDomain=self._domainObj)
self._laserBeam = lb.LaserBeam(laser=ui_laser,
point=Vector((0.0, 0.0, 1.0)),
axis=Vector((0, 0, -1.0)))
self._illumination = illum.Illumination(
process=self._process)
self._render_path = path.join(context.scene.ILSP_tempThumbnailDir,
'thumbnail.png')
def _addDomain(self):
domainObj = bpy.context.scene.objects.get('ilsp_thumb_plane')
if domainObj:
return domainObj
bpy.ops.mesh.primitive_plane_add(
size=1,
enter_editmode=False,
align='WORLD',
location=(0, 0, 0),
scale=(1, 1, 1))
domainObj = bpy.data.objects[-1]
domainObj.name = 'ilsp_thumb_plane'
utils.selectOnlyObj(domainObj)
bpy.ops.object.modifier_add(type='REMESH')
bpy.ops.object.modifier_set_active(modifier="Remesh")
bpy.context.object.modifiers["Remesh"].mode = 'VOXEL'
bpy.context.object.modifiers["Remesh"].voxel_size = 0.01
bpy.ops.object.modifier_apply(modifier="Remesh")
thumbMaterial = bpy.data.materials.get('ilsp_thumb_material')
if not thumbMaterial:
thumbMaterial = bpy.data.materials.new('ilsp_thumb_material')
if domainObj.data.materials:
domainObj.data.materials[0] = thumbMaterial
else:
domainObj.data.materials.append(thumbMaterial)
thumbMaterial.use_nodes = True
nodeImgTex = thumbMaterial.node_tree.nodes.new('ShaderNodeTexImage')
output = thumbMaterial.node_tree.nodes["Material Output"]
thumbMaterial.node_tree.links.new(
nodeImgTex.outputs['Color'],
output.inputs['Surface']
)
thumbMaterial.preview_render_type = 'FLAT'
return domainObj
def _addCamera(self):
camera_obj = bpy.context.scene.objects.get('ilsp_camera_thumb')
if camera_obj:
return camera_obj
bpy.ops.object.camera_add(location=(0, 0, 0), rotation=(0, pi / 2, 0))
camera_obj = bpy.context.object
camera_obj.name = 'ilsp_camera_thumb'
camera_obj.data.lens_unit = 'FOV'
scn = bpy.context.scene
scn.render.resolution_x = scn.render.resolution_y = 1000
camera_angle = camera_obj.data.angle
scn.camera = camera_obj
camera_dist = 0.5 * (tan(camera_angle / 2) ** -1)
camera_loc = (0, 0, camera_dist)
camera_obj.location = camera_loc
dir_vec = -camera_obj.location
camera_obj.rotation_euler = dir_vec.to_track_quat('-Z', 'Y').to_euler()
return camera_obj
def _render(self, context):
for obj in bpy.context.scene.objects:
if obj.type == 'MESH':
obj.hide_render = True
self._domainObj.hide_render = False
bpy.data.scenes['Scene'].render.filepath = self._render_path
bpy.ops.render.render(write_still=True)
render = bpy.context.scene.render
init_res_x = render.resolution_x
init_res_y = render.resolution_y
if hasattr(context.preferences.view, "render_display_type"):
init_display = bpy.context.preferences.view.render_display_type
else:
init_display = context.scene.render.display_mode
pixels = int(1000)
try:
render.resolution_x = pixels
render.resolution_y = pixels
if hasattr(context.preferences.view, "render_display_type"):
context.preferences.view.render_display_type = "WINDOW"
else:
context.scene.render.display_mode = "WINDOW"
area = self._createWindow()
self._loadPreview(area)
except Exception as e:
raise e
finally:
render.resolution_x = init_res_x
render.resolution_y = init_res_y
if hasattr(context.preferences.view, "render_display_type"):
context.preferences.view.render_display_type = init_display
else:
context.scene.render.display_mode = init_display
def _createWindow(self):
bpy.ops.render.view_show("INVOKE_DEFAULT")
area = None
for window in bpy.context.window_manager.windows:
this_area = window.screen.areas[0]
if this_area.type == "IMAGE_EDITOR":
area = this_area
break
if not area:
return None
area.header_text_set('iLSP')
area.show_menus = False
return area
def _loadPreview(self, area):
thumbnail = bpy.data.images.load(self._render_path)
if area:
area.spaces[0].image = thumbnail
else:
msg = "Open the image now loaded in an image viewer"
self.report({"ERROR"}, msg)
[docs]
def simulate(self, context):
utils.selectOnlyObj(self._domainObj)
self._illumination.simulate(laserBeam=self._laserBeam)
self._render(context)
img = bpy.data.images.get('thumbnail.png')
#self._nodeImgTex.image = img