Source code for liatool.thumbProcess

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