X-Git-Url: https://git.ao2.it/vrm.git/blobdiff_plain/dcc666c5b495072d477e85b544d6eb967fb6acc0..159f92477d4654437623a3e564619519b9a1fdd1:/vrm.py?ds=sidebyside diff --git a/vrm.py b/vrm.py index 35df00c..fc7cb5d 100755 --- a/vrm.py +++ b/vrm.py @@ -1,7 +1,7 @@ #!BPY """ Name: 'VRM' -Blender: 241 +Blender: 242 Group: 'Render' Tooltip: 'Vector Rendering Method script' """ @@ -80,20 +80,23 @@ from math import * # Some global settings -PRINT_POLYGONS = True +class config: + polygons = dict() + polygons['FILL'] = True + polygons['STYLE'] = None + # Hidden to the user for now + polygons['EXPANSION_TRICK'] = True -POLYGON_EXPANSION_TRICK = True # Hidden to the user for now + edges = dict() + edges['SHOW'] = True + edges['SHOW_HIDDEN'] = False + edges['STYLE'] = 'silhouette' + edges['WIDTH'] = 2 -PRINT_EDGES = False -SHOW_HIDDEN_EDGES = False -EDGE_STYLE = 'silhouette' -EDGES_WIDTH = 0.5 - -RENDER_ANIMATION = False - -OPTIMIZE_FOR_SPACE = True - -OUTPUT_FORMAT = 'SVG' + output = dict() + output['FORMAT'] = 'SVG' + output['ANIMATION'] = False + output['MERGED_OBJECTS'] = True @@ -155,9 +158,29 @@ class MeshUtils: else: return False + def toonShading(u): + + levels = 2 + texels = 2*levels - 1 + map = [0.0] + [(i)/float(texels-1) for i in range(1, texels-1) ] + [1.0] + + v = 1.0 + for i in range(0, len(map)-1): + pivot = (map[i]+map[i+1])/2.0 + j = int(u>pivot) + + v = map[i+j] + + if v 0.5) + Idiff = Ip * kd * MeshUtils.toonShading(N*L) + # Specular component ks = mat.getSpec() * Vector(mat.getSpecCol()) ns = mat.getHardness() - Ispec = Ip * ks * pow((V * R), ns) + Ispec = Ip * ks * pow((V*R), ns) # Emissive component ki = Vector([mat.getEmit()]*3) I = ki + Iamb + Idiff + Ispec + # Set Alpha component I = list(I) I.append(mat.getAlpha()) + # Toon shading + #I = [MeshUtils.toonShading(c) for c in I] + # Clamp I values between 0 and 1 I = [ min(c, 1) for c in I] I = [ max(0, c) for c in I] @@ -1187,38 +1219,41 @@ class GUI: def _init(): # Output Format menu - default_value = outputWriters.keys().index(OUTPUT_FORMAT)+1 + output_format = config.output['FORMAT'] + default_value = outputWriters.keys().index(output_format)+1 GUI.outFormatMenu = Draw.Create(default_value) GUI.evtOutFormatMenu = 0 # Animation toggle button - GUI.animToggle = Draw.Create(RENDER_ANIMATION) + GUI.animToggle = Draw.Create(config.output['ANIMATION']) GUI.evtAnimToggle = 1 # Join Objects toggle button - GUI.joinObjsToggle = Draw.Create(OPTIMIZE_FOR_SPACE) + GUI.joinObjsToggle = Draw.Create(config.output['MERGED_OBJECTS']) GUI.evtJoinObjsToggle = 2 # Render filled polygons - GUI.polygonsToggle = Draw.Create(PRINT_POLYGONS) + GUI.polygonsToggle = Draw.Create(config.polygons['FILL']) + GUI.evtPolygonsToggle = 3 - # We hide the POLYGON_EXPANSION_TRICK, for now + # We hide the config.polygons['EXPANSION_TRICK'], for now # Render polygon edges - GUI.showEdgesToggle = Draw.Create(PRINT_EDGES) + GUI.showEdgesToggle = Draw.Create(config.edges['SHOW']) GUI.evtShowEdgesToggle = 4 # Render hidden edges - GUI.showHiddenEdgesToggle = Draw.Create(SHOW_HIDDEN_EDGES) + GUI.showHiddenEdgesToggle = Draw.Create(config.edges['SHOW_HIDDEN']) GUI.evtShowHiddenEdgesToggle = 5 # Edge Style menu - default_value = edgeSelectionStyles.keys().index(EDGE_STYLE)+1 + edge_style = config.edges['STYLE'] + default_value = edgeSelectionStyles.keys().index(edge_style)+1 GUI.edgeStyleMenu = Draw.Create(default_value) GUI.evtEdgeStyleMenu = 6 # Edge Width slider - GUI.edgeWidthSlider = Draw.Create(EDGES_WIDTH) + GUI.edgeWidthSlider = Draw.Create(config.edges['WIDTH']) GUI.evtEdgeWidthSlider = 7 # Render Button @@ -1311,38 +1346,38 @@ class GUI: Draw.Redraw(1) def button_event(evt): - global PRINT_POLYGONS - global POLYGON_EXPANSION_TRICK - global PRINT_EDGES - global SHOW_HIDDEN_EDGES - global EDGE_STYLE - global EDGES_WIDTH - global RENDER_ANIMATION - global OPTIMIZE_FOR_SPACE - global OUTPUT_FORMAT if evt == GUI.evtExitButton: Draw.Exit() + elif evt == GUI.evtOutFormatMenu: i = GUI.outFormatMenu.val - 1 - OUTPUT_FORMAT = outputWriters.keys()[i] + config.output['FORMAT']= outputWriters.keys()[i] + elif evt == GUI.evtAnimToggle: - RENDER_ANIMATION = bool(GUI.animToggle.val) + config.outpur['ANIMATION'] = bool(GUI.animToggle.val) + elif evt == GUI.evtJoinObjsToggle: - OPTIMIZE_FOR_SPACE = bool(GUI.joinObjsToggle.val) + config.output['MERGED_OBJECTS'] = bool(GUI.joinObjsToggle.val) + elif evt == GUI.evtPolygonsToggle: - PRINT_POLYGONS = bool(GUI.polygonsToggle.val) + config.polygons['FILL'] = bool(GUI.polygonsToggle.val) + elif evt == GUI.evtShowEdgesToggle: - PRINT_EDGES = bool(GUI.showEdgesToggle.val) + config.edges['SHOW'] = bool(GUI.showEdgesToggle.val) + elif evt == GUI.evtShowHiddenEdgesToggle: - SHOW_HIDDEN_EDGES = bool(GUI.showHiddenEdgesToggle.val) + config.edges['SHOW_HIDDEN'] = bool(GUI.showHiddenEdgesToggle.val) + elif evt == GUI.evtEdgeStyleMenu: i = GUI.edgeStyleMenu.val - 1 - EDGE_STYLE = edgeSelectionStyles.keys()[i] + config.edges['STYLE'] = edgeSelectionStyles.keys()[i] + elif evt == GUI.evtEdgeWidthSlider: - EDGES_WIDTH = float(GUI.edgeWidthSlider.val) + config.edges['WIDTH'] = float(GUI.edgeWidthSlider.val) + elif evt == GUI.evtRenderButton: - label = "Save %s" % OUTPUT_FORMAT + label = "Save %s" % config.output['FORMAT'] # Show the File Selector global outputfile Blender.Window.FileSelector(vectorize, label, outputfile) @@ -1352,19 +1387,11 @@ class GUI: if evt: Draw.Redraw(1) - #GUI.conf_debug() + GUI.conf_debug() def conf_debug(): - print - print "PRINT_POLYGONS:", PRINT_POLYGONS - print "POLYGON_EXPANSION_TRICK:", POLYGON_EXPANSION_TRICK - print "PRINT_EDGES:", PRINT_EDGES - print "SHOW_HIDDEN_EDGES:", SHOW_HIDDEN_EDGES - print "EDGE_STYLE:", EDGE_STYLE - print "EDGES_WIDTH:", EDGES_WIDTH - print "RENDER_ANIMATION:", RENDER_ANIMATION - print "OPTIMIZE_FOR_SPACE:", OPTIMIZE_FOR_SPACE - print "OUTPUT_FORMAT:", OUTPUT_FORMAT + from pprint import pprint + pprint(config) _init = staticmethod(_init) draw = staticmethod(draw) @@ -1388,11 +1415,11 @@ def vectorize(filename): editmode = Window.EditMode() if editmode: Window.EditMode(0) - actualWriter = outputWriters[OUTPUT_FORMAT] + actualWriter = outputWriters[config.output['FORMAT']] writer = actualWriter(filename) renderer = Renderer() - renderer.doRendering(writer, RENDER_ANIMATION) + renderer.doRendering(writer, config.output['ANIMATION']) if editmode: Window.EditMode(1) @@ -1403,7 +1430,7 @@ if __name__ == "__main__": outputfile = "" basename = Blender.sys.basename(Blender.Get('filename')) if basename != "": - outputfile = Blender.sys.splitext(basename)[0] + "." + str(OUTPUT_FORMAT).lower() + outputfile = Blender.sys.splitext(basename)[0] + "." + str(config.output['FORMAT']).lower() if Blender.mode == 'background': vectorize(outputfile)