Tessellate on supported targets only.

This commit is contained in:
Lubos Lenco 2016-11-30 11:40:28 +01:00
parent 3a6155187f
commit 7f12b29d6d
6 changed files with 47 additions and 37 deletions

View file

@ -195,7 +195,13 @@ def patch_project():
os.chdir(fp)
export_data(fp, sdk_path, is_play=True)
def build_project(is_play=False, is_publish=False, in_viewport=False):
def build_project(is_play=False, is_publish=False, in_viewport=False, target=None):
wrd = bpy.data.worlds['Arm']
# Set target
if target == None:
state.target = wrd.arm_project_target.lower()
# Clear flag
state.in_viewport = False
@ -204,7 +210,6 @@ def build_project(is_play=False, is_publish=False, in_viewport=False):
log.clear()
# Set camera in active scene
wrd = bpy.data.worlds['Arm']
active_scene = bpy.context.screen.scene if wrd.arm_play_active_scene else bpy.data.scenes[wrd.arm_project_scene]
if active_scene.camera == None:
for o in active_scene.objects:
@ -250,8 +255,6 @@ def build_project(is_play=False, is_publish=False, in_viewport=False):
with open('Sources/' + bpy.data.worlds['Arm'].arm_project_package + '/' + text.name, 'w') as f:
f.write(text.as_string())
# Save internal assets
# Export data
export_data(fp, sdk_path, is_play=is_play, is_publish=is_publish, in_viewport=in_viewport)
@ -303,39 +306,39 @@ def watch_patch():
state.compileproc_finished = True
def play_project(self, in_viewport):
wrd = bpy.data.worlds['Arm']
# Store area
if armutils.with_krom() and in_viewport and bpy.context.area.type == 'VIEW_3D':
state.play_area = bpy.context.area
# Set target
if in_viewport or wrd.arm_play_runtime == 'Krom':
state.target = 'krom'
elif wrd.arm_play_runtime == 'Native':
state.target = 'native'
else:
state.target = 'html5'
# Build data
build_project(is_play=True, in_viewport=in_viewport)
build_project(is_play=True, in_viewport=in_viewport, target=state.target)
state.in_viewport = in_viewport
wrd = bpy.data.worlds['Arm']
# Native
if in_viewport == False and wrd.arm_play_runtime == 'Native':
# Compile
mode = 'play'
if state.target == 'native':
state.compileproc = compile_project(target_name='--run')
mode = 'play'
threading.Timer(0.1, watch_compile, [mode]).start()
# Viewport
elif armutils.with_krom() and in_viewport:
elif state.target == 'krom':
if in_viewport:
mode = 'play_viewport'
state.compileproc = compile_project(target_name='krom')
mode = 'play_viewport'
threading.Timer(0.1, watch_compile, [mode]).start()
# Krom
elif in_viewport == False and wrd.arm_play_runtime == 'Krom':
w, h = armutils.get_render_resolution()
state.compileproc = compile_project(target_name='krom')
mode = 'play'
threading.Timer(0.1, watch_compile, [mode]).start()
# Electron, Browser
else:
else: # Electron, Browser
w, h = armutils.get_render_resolution()
write_data.write_electronjs(w, h)
write_data.write_indexhtml(w, h)
state.compileproc = compile_project(target_name='html5')
mode = 'play'
threading.Timer(0.1, watch_compile, [mode]).start()
threading.Timer(0.1, watch_compile, [mode]).start()
def on_compiled(mode): # build, play, play_viewport, publish
log.clear()
@ -343,7 +346,7 @@ def on_compiled(mode): # build, play, play_viewport, publish
# Print info
if mode == 'publish':
target_name = make_utils.get_kha_target(bpy.data.worlds['Arm'].arm_publish_target)
target_name = make_utils.get_kha_target(bpy.data.worlds['Arm'].arm_project_target)
print('Project published')
files_path = armutils.get_fp() + '/build/' + target_name
if target_name == 'html5':
@ -454,7 +457,7 @@ def publish_project():
bpy.data.worlds['Arm'].arm_minimize = True
clean_project()
build_project(is_publish=True)
state.compileproc = compile_project(target_name=bpy.data.worlds['Arm'].arm_publish_target, is_publish=True)
state.compileproc = compile_project(target_name=bpy.data.worlds['Arm'].arm_project_target, is_publish=True)
threading.Timer(0.1, watch_compile, ['publish']).start()
bpy.data.worlds['Arm'].arm_minimize = minimize
assets.invalidate_enabled = True

View file

@ -5,9 +5,9 @@ import armutils
import os
import nodes
import log
import make_state as state
# UV Map names of current material user
uvlayers = ['']
uvlayers = [''] # UV Map names of current material user
def is_pow(num):
return ((num & (num - 1)) == 0) and num != 0
@ -525,7 +525,11 @@ def parse_occlusion_socket(self, occlusion_input, material, c, defs, tree, node,
add_occlusion_const(res, c, factor)
def parse_height_socket(self, height_input, material, c, defs, tree, node, factor):
if height_input.is_linked:
# Not all targets can tessellate
if state.target != 'krom' and state.target != 'native':
return
wrd = bpy.data.worlds['Arm']
if height_input.is_linked and wrd.tessellation_enabled:
height_node = nodes.find_node_by_link(tree, node, height_input)
add_height_tex(self, height_node, material, c, defs)
parse_image_vector(height_node, defs, tree, '_HeightTex1')

View file

@ -1,4 +1,5 @@
target = 'krom'
in_viewport = False
playproc = None
compileproc = None

View file

@ -27,7 +27,6 @@ def init_properties():
name="Target", default='html5',
description='Build paltform')
bpy.types.World.arm_project_target = target_prop
bpy.types.World.arm_publish_target = target_prop
bpy.types.World.arm_project_name = StringProperty(name="Name", description="Exported project name", default="")
bpy.types.World.arm_project_package = StringProperty(name="Package", description="Package name for scripts", default="arm")
bpy.types.World.arm_play_active_scene = BoolProperty(name="Play Active Scene", description="Load currently edited scene when launching player", default=True)
@ -264,6 +263,7 @@ def init_properties():
bpy.types.World.force_no_culling = bpy.props.BoolProperty(name="Force No Culling", default=False)
bpy.types.World.force_anisotropic_filtering = bpy.props.BoolProperty(name="Force Anisotropic Filtering", default=True)
bpy.types.World.npot_texture_repeat = bpy.props.BoolProperty(name="Non-Power of 2 Texture Repeat", description="Enable texture repeat mode for non-power of two textures", default=False)
bpy.types.World.tessellation_enabled = bpy.props.BoolProperty(name="Tessellation", description="Enable tessellation for height maps on supported targets", default=True)
# Lighting flags
bpy.types.World.diffuse_oren_nayar = bpy.props.BoolProperty(name="Oren Nayar Diffuse", default=False, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi = bpy.props.BoolProperty(name="VGI", description="Voxel-based Global Illumination", default=False, update=assets.invalidate_shader_cache)

View file

@ -332,8 +332,9 @@ class WorldPropsPanel(bpy.types.Panel):
layout.prop(wrd, 'generate_fog_amountb')
layout.label('Flags')
layout.prop(wrd, 'force_no_culling')
layout.prop(wrd, 'tessellation_enabled')
layout.prop(wrd, 'force_anisotropic_filtering')
layout.prop(wrd, 'force_no_culling')
layout.prop(wrd, 'npot_texture_repeat')
layout.prop(wrd, 'diffuse_oren_nayar')
layout.prop(wrd, 'voxelgi')
@ -427,7 +428,7 @@ class ArmoryProjectPanel(bpy.types.Panel):
layout.prop_search(wrd, 'arm_khafile', bpy.data, 'texts', 'Khafile')
layout.prop_search(wrd, 'arm_command_line', bpy.data, 'texts', 'Command Line')
layout.operator('arm.publish')
layout.prop(wrd, 'arm_publish_target')
layout.prop(wrd, 'arm_project_target')
layout.prop(wrd, 'arm_project_advanced')
if wrd.arm_project_advanced:

View file

@ -2,6 +2,7 @@ import bpy
import os
import assets
import armutils
import make_state as state
def add_armory_library(sdk_path, name):
return ('project.addLibrary("../' + bpy.path.relpath(sdk_path + '/' + name)[2:] + '");\n').replace('\\', '/')
@ -31,10 +32,10 @@ project.addSources('Sources');
if export_physics:
f.write("project.addDefine('arm_physics');\n")
f.write(add_armory_library(sdk_path + '/lib/', 'haxebullet'))
# TODO: include for js only
ammojs_path = sdk_path + '/lib/haxebullet/js/ammo/ammo.js'
ammojs_path = ammojs_path.replace('\\', '/')
f.write("project.addAssets('" + ammojs_path + "');\n")
if state.target == 'krom' or state.target == 'html5':
ammojs_path = sdk_path + '/lib/haxebullet/js/ammo/ammo.js'
ammojs_path = ammojs_path.replace('\\', '/')
f.write("project.addAssets('" + ammojs_path + "');\n")
if dce_full:
f.write("project.addParameter('-dce full');")