Fix translucent, redirect traces to Blender.
This commit is contained in:
parent
db00e84343
commit
cd2e936fcf
|
@ -1,4 +1,4 @@
|
|||
package armory.renderpipeline;
|
||||
package armory.renderpath;
|
||||
|
||||
import iron.data.RenderPath;
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
// An Analytic Model for Full Spectral Sky-Dome Radiance
|
||||
// Lukas Hosek and Alexander Wilkie
|
||||
// Based on https://github.com/ddiakopoulos/sandbox
|
||||
package armory.renderpipeline;
|
||||
package armory.renderpath;
|
||||
|
||||
import kha.math.FastVector3;
|
||||
import iron.data.RenderPath;
|
|
@ -97,7 +97,7 @@ This file contains the coefficient data for the RGB colour space version of
|
|||
the model.
|
||||
*/
|
||||
|
||||
package armory.renderpipeline;
|
||||
package armory.renderpath;
|
||||
|
||||
class HosekWilkieData {
|
||||
|
|
@ -36,7 +36,12 @@ class FirstPersonController extends Trait {
|
|||
function init() {
|
||||
transform = object.transform;
|
||||
body = object.getTrait(RigidBody);
|
||||
camera = cast(object, CameraObject);
|
||||
for (o in object.children) {
|
||||
if (Std.is(o, CameraObject)) {
|
||||
camera = cast(o, CameraObject);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onDown(key: kha.Key, char: String) {
|
||||
|
|
|
@ -29,7 +29,7 @@ class PathTracer extends Trait {
|
|||
function getColorFromNode(object:MeshObject):Array<Float> {
|
||||
// Hard code for now
|
||||
for (c in object.materials[0].contexts[0].raw.bind_constants) {
|
||||
if (c.name == "albedo_color") {
|
||||
if (c.name == "baseCol") {
|
||||
return c.vec4;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,8 +19,6 @@ class ContactPair {
|
|||
|
||||
class PhysicsWorld extends Trait {
|
||||
|
||||
public static var active:PhysicsWorld;
|
||||
|
||||
#if (!WITH_PHYSICS)
|
||||
public function new() { super(); }
|
||||
#else
|
||||
|
@ -29,11 +27,13 @@ class PhysicsWorld extends Trait {
|
|||
public static var physTime = 0.0;
|
||||
#end
|
||||
|
||||
public static var active:PhysicsWorld = null;
|
||||
|
||||
public var world:BtDiscreteDynamicsWorldPointer;
|
||||
var dispatcher:BtCollisionDispatcherPointer;
|
||||
|
||||
var contacts:Array<ContactPair> = [];
|
||||
var rbMap:Map<Int, RigidBody>;
|
||||
public var rbMap:Map<Int, RigidBody>;
|
||||
|
||||
static inline var timeStep = 1 / 60;
|
||||
static inline var fixedStep = 1 / 60;
|
||||
|
@ -41,8 +41,13 @@ class PhysicsWorld extends Trait {
|
|||
public function new() {
|
||||
super();
|
||||
|
||||
active = this;
|
||||
if (active != null) {
|
||||
for (rb in active.rbMap) removeRigidBody(rb);
|
||||
active.rbMap = new Map();
|
||||
return;
|
||||
}
|
||||
|
||||
active = this;
|
||||
rbMap = new Map();
|
||||
|
||||
//var min = BtVector3.create(-100, -100, -100);
|
||||
|
|
Binary file not shown.
|
@ -576,11 +576,11 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
|
||||
self.ExportBoneTransform(armature, bone, scene, o, action)
|
||||
|
||||
o['objects'] = [] # TODO
|
||||
o['children'] = [] # TODO
|
||||
for subbobject in bone.children:
|
||||
so = {}
|
||||
self.ExportBone(armature, subbobject, scene, so, action)
|
||||
o['objects'].append(so)
|
||||
o['children'].append(so)
|
||||
|
||||
# Export any ordinary objects that are parented to this bone
|
||||
boneSubbobjectArray = self.boneParentArray.get(bone.name)
|
||||
|
@ -1416,7 +1416,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
o['type'] = structIdentifier[type]
|
||||
o['name'] = bobjectRef["structName"]
|
||||
|
||||
if bobject.hide_render:
|
||||
if bobject.hide_render or bobject.game_visible == False:
|
||||
o['visible'] = False
|
||||
|
||||
if bobject.spawn == False:
|
||||
|
@ -1528,6 +1528,8 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
export_actions = [action]
|
||||
|
||||
for action in export_actions:
|
||||
if armdata.animation_data == None:
|
||||
continue
|
||||
armdata.animation_data.action = action
|
||||
fp = self.get_meshes_file_path('bones_' + armatureid + '_' + action.name)
|
||||
assets.add(fp)
|
||||
|
@ -1541,19 +1543,19 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
bones.append(boneo)
|
||||
# Save bones separately
|
||||
bones_obj = {}
|
||||
bones_obj['objects'] = bones
|
||||
bones_obj['children'] = bones
|
||||
utils.write_arm(fp, bones_obj)
|
||||
armdata.armature_cached = True
|
||||
|
||||
if (parento == None):
|
||||
self.output['objects'].append(o)
|
||||
else:
|
||||
parento['objects'].append(o)
|
||||
parento['children'].append(o)
|
||||
|
||||
self.cb_export_object(bobject, o, type)
|
||||
|
||||
if not hasattr(o, 'objects'):
|
||||
o['objects'] = []
|
||||
if not hasattr(o, 'children'):
|
||||
o['children'] = []
|
||||
|
||||
if bobject.type != 'MESH' or self.object_has_instanced_children(bobject) == False:
|
||||
for subbobject in bobject.children:
|
||||
|
@ -2187,7 +2189,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
o['mirror_resolution_y'] = int(objref.mirror_resolution_y)
|
||||
|
||||
o['frustum_culling'] = objref.frustum_culling
|
||||
o['pipeline'] = objref.pipeline_path + '/' + objref.pipeline_path # Same file name and id
|
||||
o['render_path'] = objref.renderpath_path + '/' + objref.renderpath_path # Same file name and id
|
||||
|
||||
if self.scene.world != None and 'Background' in self.scene.world.node_tree.nodes: # TODO: parse node tree
|
||||
background_node = self.scene.world.node_tree.nodes['Background']
|
||||
|
@ -2255,7 +2257,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
const['float'] = 0
|
||||
c['bind_constants'].append(const)
|
||||
const = {}
|
||||
const['name'] = 'albedo_color'
|
||||
const['name'] = 'baseCol'
|
||||
const['vec4'] = [0.8, 0.8, 0.8, 1.0]
|
||||
c['bind_constants'].append(const)
|
||||
const = {}
|
||||
|
@ -2282,7 +2284,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
c['name'] = ArmoryExporter.mesh_context_empty
|
||||
o['contexts'].append(c)
|
||||
defs = []
|
||||
self.finalize_shader(o, defs, ArmoryExporter.pipeline_passes)
|
||||
self.finalize_shader(o, defs, ArmoryExporter.renderpath_passes)
|
||||
self.output['material_datas'].append(o)
|
||||
|
||||
def ExportParticleSystems(self):
|
||||
|
@ -2430,6 +2432,8 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
return bobject.instanced_children
|
||||
|
||||
def object_is_mesh_cached(self, bobject):
|
||||
if bobject.type == 'FONT': # No verts for font
|
||||
return bobject.data.mesh_cached
|
||||
if bobject.data.mesh_cached_verts != len(bobject.data.vertices):
|
||||
return False
|
||||
if bobject.data.mesh_cached_edges != len(bobject.data.edges):
|
||||
|
@ -2438,7 +2442,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
|
||||
def object_set_mesh_cached(self, bobject, b):
|
||||
bobject.data.mesh_cached = b
|
||||
if b:
|
||||
if b and bobject.type != 'FONT':
|
||||
bobject.data.mesh_cached_verts = len(bobject.data.vertices)
|
||||
bobject.data.mesh_cached_edges = len(bobject.data.edges)
|
||||
|
||||
|
@ -2485,11 +2489,11 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
ArmoryExporter.option_sample_animation = bpy.data.worlds['Arm'].ArmSampledAnimation
|
||||
ArmoryExporter.sampleAnimationFlag = ArmoryExporter.option_sample_animation
|
||||
|
||||
# Only one pipeline for scene for now
|
||||
# Only one render path for scene for now
|
||||
# Used for material shader export and khafile
|
||||
if (len(bpy.data.cameras) > 0):
|
||||
ArmoryExporter.pipeline_id = bpy.data.cameras[0].pipeline_id
|
||||
ArmoryExporter.pipeline_passes = bpy.data.cameras[0].pipeline_passes.split('_')
|
||||
ArmoryExporter.renderpath_id = bpy.data.cameras[0].renderpath_id
|
||||
ArmoryExporter.renderpath_passes = bpy.data.cameras[0].renderpath_passes.split('_')
|
||||
ArmoryExporter.mesh_context = bpy.data.cameras[0].mesh_context
|
||||
ArmoryExporter.mesh_context_empty = bpy.data.cameras[0].mesh_context_empty
|
||||
ArmoryExporter.shadows_context = bpy.data.cameras[0].shadows_context
|
||||
|
@ -2737,7 +2741,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
if m.type == 'UV_PROJECT':
|
||||
decal_uv_layer = m.uv_layer
|
||||
break
|
||||
# Get decal context from pipes
|
||||
# Get decal context from render paths
|
||||
decal_context = bpy.data.cameras[0].last_decal_context
|
||||
|
||||
# Parse nodes
|
||||
|
@ -2817,7 +2821,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
|
||||
# Process defs and append datas
|
||||
if material.override_shader == False:
|
||||
self.finalize_shader(o, defs, ArmoryExporter.pipeline_passes)
|
||||
self.finalize_shader(o, defs, ArmoryExporter.renderpath_passes)
|
||||
else:
|
||||
# TODO: gather defs from vertex data when custom shader is used
|
||||
o['shader'] = material.override_shader_name
|
||||
|
@ -2889,7 +2893,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
po['volume_center'] = volume_center
|
||||
return po
|
||||
|
||||
def finalize_shader(self, o, defs, pipeline_passes):
|
||||
def finalize_shader(self, o, defs, renderpath_passes):
|
||||
# Merge duplicates and sort
|
||||
defs = sorted(list(set(defs)))
|
||||
# Select correct shader variant
|
||||
|
@ -2900,13 +2904,13 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
ext += bpy.data.worlds['Arm'].world_defs
|
||||
|
||||
# Shader data
|
||||
shader_data_name = ArmoryExporter.pipeline_id + ext
|
||||
shader_data_path = 'build/compiled/ShaderDatas/' + ArmoryExporter.pipeline_id + '/' + shader_data_name + '.arm'
|
||||
shader_data_name = ArmoryExporter.renderpath_id + ext
|
||||
shader_data_path = 'build/compiled/ShaderDatas/' + ArmoryExporter.renderpath_id + '/' + shader_data_name + '.arm'
|
||||
# Stencil mask
|
||||
# if material.stencil_mask > 0:
|
||||
# mask_ext = "_mask" + str(material.stencil_mask)
|
||||
# shader_data_name_with_mask = shader_data_name + mask_ext
|
||||
# shader_data_path_with_mask = 'build/compiled/ShaderDatas/' + ArmoryExporter.pipeline_id + '/' + shader_data_name_with_mask + '.arm'
|
||||
# shader_data_path_with_mask = 'build/compiled/ShaderDatas/' + ArmoryExporter.renderpath_id + '/' + shader_data_name_with_mask + '.arm'
|
||||
# # Copy data if it does not exist and set stencil mask
|
||||
# if not os.path.isfile(shader_data_path_with_mask):
|
||||
# json_file = open(shader_data_path).read()
|
||||
|
@ -2924,10 +2928,10 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper):
|
|||
# else:
|
||||
ArmoryExporter.asset_references.append(shader_data_path)
|
||||
o['shader'] = shader_data_name + '/' + shader_data_name
|
||||
# Process all passes from pipeline
|
||||
for pipe_pass in pipeline_passes:
|
||||
shader_name = pipe_pass + ext
|
||||
ArmoryExporter.shader_references.append('build/compiled/Shaders/' + ArmoryExporter.pipeline_id + '/' + shader_name)
|
||||
# Process all passes from render path
|
||||
for ren_pass in renderpath_passes:
|
||||
shader_name = ren_pass + ext
|
||||
ArmoryExporter.shader_references.append('build/compiled/Shaders/' + ArmoryExporter.renderpath_id + '/' + shader_name)
|
||||
|
||||
def register():
|
||||
bpy.utils.register_class(ArmoryExporter)
|
||||
|
|
|
@ -7,7 +7,6 @@ import json
|
|||
from bpy.props import *
|
||||
from props import *
|
||||
import subprocess
|
||||
from subprocess import PIPE
|
||||
import threading
|
||||
import webbrowser
|
||||
import write_data
|
||||
|
@ -120,8 +119,7 @@ def export_data(fp, sdk_path, is_play=False):
|
|||
# Assume asset_references contains shader datas only for now
|
||||
for ref in asset_references:
|
||||
# Data does not exist yet
|
||||
os.chdir(fp)
|
||||
if not os.path.exists(ref):
|
||||
if not os.path.isfile(fp + '/' + ref):
|
||||
shader_name = ref.split('/')[3] # Extract from 'build/compiled/...'
|
||||
strdefs = ref[:-4] # Remove '.arm' extension
|
||||
defs = strdefs.split(shader_name) # 'name/name_def_def'
|
||||
|
@ -149,11 +147,11 @@ def export_data(fp, sdk_path, is_play=False):
|
|||
# Write Main.hx
|
||||
write_data.write_main()
|
||||
|
||||
def print_info(text):
|
||||
def armory_log(text):
|
||||
print(text)
|
||||
ArmoryProjectPanel.info_text = text
|
||||
# for area in bpy.context.screen.areas:
|
||||
# if area.type == 'INFO':
|
||||
# area.tag_redraw()
|
||||
armory_log.tag_redraw = True
|
||||
armory_log.tag_redraw = False
|
||||
|
||||
def compile_project(target_name=None):
|
||||
user_preferences = bpy.context.user_preferences
|
||||
|
@ -185,7 +183,7 @@ def compile_project(target_name=None):
|
|||
|
||||
cmd = [node_path, khamake_path, target_name, '--glsl2']
|
||||
|
||||
# print_info("Building, see console...")
|
||||
# armory_log("Building, see console...")
|
||||
|
||||
if make.play_project.playproc == None:
|
||||
return subprocess.Popen(cmd)
|
||||
|
@ -198,7 +196,7 @@ def compile_project(target_name=None):
|
|||
cmd.append('--krafix')
|
||||
cmd.append('""')
|
||||
# Khamake throws error when krafix is not found, hide for now
|
||||
return subprocess.Popen(cmd, stderr=PIPE)
|
||||
return subprocess.Popen(cmd, stderr=subprocess.PIPE)
|
||||
|
||||
# For live patching
|
||||
def patch_project():
|
||||
|
@ -232,7 +230,7 @@ def build_project(is_play=False):
|
|||
os.makedirs('build/debug-html5')
|
||||
|
||||
# Compile path tracer shaders
|
||||
if len(bpy.data.cameras) > 0 and bpy.data.cameras[0].pipeline_path == 'pathtrace_path':
|
||||
if len(bpy.data.cameras) > 0 and bpy.data.cameras[0].renderpath_path == 'pathtrace_path':
|
||||
path_tracer.compile(raw_path + 'pt_trace_pass/pt_trace_pass.frag.glsl')
|
||||
|
||||
# Save external scripts edited inside Blender
|
||||
|
@ -270,24 +268,29 @@ def stop_project():
|
|||
def watch_play():
|
||||
if play_project.playproc == None:
|
||||
return
|
||||
if play_project.playproc.poll() == None:
|
||||
threading.Timer(0.5, watch_play).start()
|
||||
else:
|
||||
play_project.playproc = None
|
||||
line = b''
|
||||
while play_project.playproc != None and play_project.playproc.poll() == None:
|
||||
char = play_project.playproc.stderr.read(1) # Read immediately one by one
|
||||
if char == b'\n':
|
||||
trace = str(line).split('"') # Extract trace
|
||||
if len(trace) > 2:
|
||||
armory_log(trace[1])
|
||||
line = b''
|
||||
else:
|
||||
line += char
|
||||
play_project.playproc = None
|
||||
armory_log('Ready')
|
||||
|
||||
def watch_compile():
|
||||
return_code = play_project.compileproc.poll()
|
||||
if return_code == None:
|
||||
threading.Timer(0.1, watch_compile).start()
|
||||
play_project.compileproc.wait()
|
||||
result = play_project.compileproc.poll()
|
||||
play_project.compileproc = None
|
||||
if result == 0:
|
||||
on_compiled()
|
||||
else:
|
||||
play_project.compileproc = None
|
||||
if return_code == 0:
|
||||
on_compiled()
|
||||
else:
|
||||
# self.report({'ERROR'}, 'Build failed, check console')
|
||||
print('Build failed, check console')
|
||||
armory_log('Build failed, check console')
|
||||
|
||||
def play_project(in_viewport):
|
||||
def play_project(self, in_viewport):
|
||||
# Build data
|
||||
build_project(is_play=True)
|
||||
|
||||
|
@ -328,7 +331,7 @@ def play_project(in_viewport):
|
|||
|
||||
# Compile
|
||||
play_project.compileproc = compile_project(target_name='html5')
|
||||
watch_compile()
|
||||
threading.Timer(0.1, watch_compile).start()
|
||||
|
||||
def run_server():
|
||||
Handler = http.server.SimpleHTTPRequestHandler
|
||||
|
@ -339,7 +342,7 @@ def run_server():
|
|||
print('Server already running')
|
||||
|
||||
def on_compiled():
|
||||
print_info("Ready")
|
||||
armory_log("Ready")
|
||||
user_preferences = bpy.context.user_preferences
|
||||
addon_prefs = user_preferences.addons['armory'].preferences
|
||||
sdk_path = addon_prefs.sdk_path
|
||||
|
@ -356,7 +359,7 @@ def on_compiled():
|
|||
else:
|
||||
electron_path = sdk_path + 'kode_studio/KodeStudio-linux64/kodestudio'
|
||||
|
||||
play_project.playproc = subprocess.Popen([electron_path, '--chromedebug', '--remote-debugging-port=9222', electron_app_path])
|
||||
play_project.playproc = subprocess.Popen([electron_path, '--chromedebug', '--remote-debugging-port=9222', '--enable-logging', electron_app_path], stderr=subprocess.PIPE)
|
||||
watch_play()
|
||||
elif wrd.ArmPlayRuntime == 'Browser':
|
||||
# Start server
|
||||
|
@ -390,7 +393,7 @@ def clean_project():
|
|||
if os.path.isfile('Sources/Main.hx'):
|
||||
os.remove('Sources/Main.hx')
|
||||
|
||||
# self.report({'INFO'}, 'Done')
|
||||
print('Project cleaned')
|
||||
|
||||
# Registration
|
||||
arm_keymaps = []
|
||||
|
|
|
@ -54,7 +54,7 @@ def make_albedo_const(col, c):
|
|||
const = {}
|
||||
parse.const_color = const
|
||||
c['bind_constants'].append(const)
|
||||
const['name'] = 'albedo_color'
|
||||
const['name'] = 'baseCol'
|
||||
const['vec4'] = [col[0], col[1], col[2], col[3]]
|
||||
|
||||
def make_roughness_const(f, c):
|
||||
|
@ -278,16 +278,16 @@ def parse_val_to_rgb(node, c, defs):
|
|||
return node.color_ramp.evaluate(factor)
|
||||
else: # Assume 2 colors interpolated by id for now
|
||||
defs.append('_RampID')
|
||||
# Link albedo_color2 as color 2
|
||||
# Link baseCol2 as color 2
|
||||
const = {}
|
||||
c['bind_constants'].append(const)
|
||||
const['name'] = 'albedo_color2'
|
||||
const['name'] = 'baseCol2'
|
||||
res = node.color_ramp.elements[1].color
|
||||
const['vec4'] = [res[0], res[1], res[2], res[3]]
|
||||
# Return color 1
|
||||
return node.color_ramp.elements[0].color
|
||||
|
||||
def add_albedo_color(c, col):
|
||||
def add_base_color(c, col):
|
||||
if parse.const_color == None:
|
||||
make_albedo_const(col, c)
|
||||
else:
|
||||
|
@ -376,11 +376,11 @@ def parse_base_color_socket(self, base_color_input, material, c, defs, tree, nod
|
|||
defs.append('_VCols')
|
||||
elif color_node.type == 'VALTORGB':
|
||||
col = parse_val_to_rgb(color_node, c, defs)
|
||||
add_albedo_color(c, col)
|
||||
add_base_color(c, col)
|
||||
elif color_node.type == 'MIX_RGB':
|
||||
parse_mix_rgb(self, material, c, defs, tree, color_node, factor)
|
||||
else: # Take node color
|
||||
add_albedo_color(c, base_color_input.default_value)
|
||||
add_base_color(c, base_color_input.default_value)
|
||||
|
||||
def add_metalness_const(res, c, factor, minimum_val=0.0, sqrt_val=False):
|
||||
if res < minimum_val:
|
||||
|
|
|
@ -349,7 +349,7 @@ class TranslucentResolvePassNode(Node, CGPipelineTreeNode):
|
|||
|
||||
self.outputs.new('NodeSocketShader', "Stage")
|
||||
|
||||
# Pipeline
|
||||
# Render path
|
||||
class DrawMeshesNode(Node, CGPipelineTreeNode):
|
||||
'''A custom node'''
|
||||
bl_idname = 'DrawMeshesNodeType'
|
||||
|
@ -806,22 +806,22 @@ def buildNodeTrees(shader_references, asset_references, assets_path):
|
|||
os.chdir(fp)
|
||||
|
||||
# Make sure Assets dir exists
|
||||
if not os.path.exists('build/compiled/Assets/pipelines'):
|
||||
os.makedirs('build/compiled/Assets/pipelines')
|
||||
if not os.path.exists('build/compiled/Assets/renderpaths'):
|
||||
os.makedirs('build/compiled/Assets/renderpaths')
|
||||
|
||||
buildNodeTrees.assets_path = assets_path
|
||||
buildNodeTrees.linked_assets = []
|
||||
# Always include
|
||||
buildNodeTrees.linked_assets.append(buildNodeTrees.assets_path + 'brdf.png')
|
||||
|
||||
# Export pipeline for each camera
|
||||
# Export render path for each camera
|
||||
parsed_paths = []
|
||||
for cam in bpy.data.cameras:
|
||||
# if cam.game_export
|
||||
if cam.pipeline_path not in parsed_paths:
|
||||
node_group = bpy.data.node_groups[cam.pipeline_path]
|
||||
if cam.renderpath_path not in parsed_paths:
|
||||
node_group = bpy.data.node_groups[cam.renderpath_path]
|
||||
buildNodeTree(cam, node_group, shader_references, asset_references)
|
||||
parsed_paths.append(cam.pipeline_path)
|
||||
parsed_paths.append(cam.renderpath_path)
|
||||
|
||||
return buildNodeTrees.linked_assets
|
||||
|
||||
|
@ -829,9 +829,9 @@ def buildNodeTree(cam, node_group, shader_references, asset_references):
|
|||
buildNodeTree.cam = cam
|
||||
output = {}
|
||||
dat = {}
|
||||
output['pipeline_datas'] = [dat]
|
||||
output['renderpath_datas'] = [dat]
|
||||
|
||||
path = 'build/compiled/Assets/pipelines/'
|
||||
path = 'build/compiled/Assets/renderpaths/'
|
||||
node_group_name = node_group.name.replace('.', '_')
|
||||
|
||||
rn = get_root_node(node_group)
|
||||
|
@ -844,7 +844,7 @@ def buildNodeTree(cam, node_group, shader_references, asset_references):
|
|||
dat['mesh_context'] = buildNodeTree.cam.mesh_context
|
||||
dat['shadows_context'] = buildNodeTree.cam.shadows_context
|
||||
|
||||
dat['render_targets'], dat['depth_buffers'] = preprocess_pipeline(rn, node_group)
|
||||
dat['render_targets'], dat['depth_buffers'] = preprocess_renderpath(rn, node_group)
|
||||
dat['stages'] = []
|
||||
|
||||
buildNode(dat['stages'], rn, node_group, shader_references, asset_references)
|
||||
|
@ -1428,7 +1428,7 @@ def get_root_node(node_group):
|
|||
for n in node_group.nodes:
|
||||
if n.bl_idname == 'BeginNodeType':
|
||||
# Store contexts
|
||||
buildNodeTree.cam.pipeline_id = n.inputs[0].default_value
|
||||
buildNodeTree.cam.renderpath_id = n.inputs[0].default_value
|
||||
mesh_contexts = n.inputs[1].default_value.split(',')
|
||||
buildNodeTree.cam.mesh_context = mesh_contexts[0]
|
||||
if len(mesh_contexts) > 1:
|
||||
|
@ -1442,27 +1442,27 @@ def get_root_node(node_group):
|
|||
break
|
||||
return rn
|
||||
|
||||
def preprocess_pipeline(root_node, node_group):
|
||||
def preprocess_renderpath(root_node, node_group):
|
||||
render_targets = []
|
||||
depth_buffers = []
|
||||
preprocess_pipeline.velocity_def_added = False
|
||||
buildNodeTree.cam.pipeline_passes = ''
|
||||
traverse_pipeline(root_node, node_group, render_targets, depth_buffers)
|
||||
preprocess_renderpath.velocity_def_added = False
|
||||
buildNodeTree.cam.renderpath_passes = ''
|
||||
traverse_renderpath(root_node, node_group, render_targets, depth_buffers)
|
||||
return render_targets, depth_buffers
|
||||
|
||||
def traverse_pipeline(node, node_group, render_targets, depth_buffers):
|
||||
def traverse_renderpath(node, node_group, render_targets, depth_buffers):
|
||||
# Gather linked draw geometry contexts
|
||||
if node.bl_idname == 'DrawMeshesNodeType':
|
||||
if buildNodeTree.cam.pipeline_passes != '':
|
||||
buildNodeTree.cam.pipeline_passes += '_' # Separator
|
||||
buildNodeTree.cam.pipeline_passes += node.inputs[1].default_value
|
||||
if buildNodeTree.cam.renderpath_passes != '':
|
||||
buildNodeTree.cam.renderpath_passes += '_' # Separator
|
||||
buildNodeTree.cam.renderpath_passes += node.inputs[1].default_value
|
||||
|
||||
# Gather defs from linked nodes
|
||||
if node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'SSAOReprojectPassNodeType':
|
||||
if preprocess_pipeline.velocity_def_added == False:
|
||||
if preprocess_renderpath.velocity_def_added == False:
|
||||
assets.add_khafile_def('WITH_VELOC')
|
||||
bpy.data.worlds['Arm'].world_defs += '_Veloc'
|
||||
preprocess_pipeline.velocity_def_added = True
|
||||
preprocess_renderpath.velocity_def_added = True
|
||||
if node.bl_idname == 'TAAPassNodeType':
|
||||
assets.add_khafile_def('WITH_TAA')
|
||||
# bpy.data.worlds['Arm'].world_defs += '_TAA'
|
||||
|
@ -1487,7 +1487,7 @@ def traverse_pipeline(node, node_group, render_targets, depth_buffers):
|
|||
elif node.bl_idname == 'LoopStagesNodeType' or node.bl_idname == 'LoopLampsNodeType' or node.bl_idname == 'DrawStereoNodeType':
|
||||
if node.outputs[1].is_linked:
|
||||
loop_node = findNodeByLinkFrom(node_group, node, node.outputs[1])
|
||||
traverse_pipeline(loop_node, node_group, render_targets, depth_buffers)
|
||||
traverse_renderpath(loop_node, node_group, render_targets, depth_buffers)
|
||||
|
||||
# Prebuilt
|
||||
elif node.bl_idname == 'MotionBlurPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'CopyPassNodeType' or node.bl_idname == 'BlendPassNodeType' or node.bl_idname == 'CombinePassNodeType' or node.bl_idname == 'DebugNormalsPassNodeType' or node.bl_idname == 'FXAAPassNodeType' or node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'WaterPassNodeType' or node.bl_idname == 'DeferredLightPassNodeType' or node.bl_idname == 'DeferredIndirectPassNodeType' or node.bl_idname == 'VolumetricLightPassNodeType' or node.bl_idname == 'TranslucentResolvePassNodeType':
|
||||
|
@ -1508,7 +1508,7 @@ def traverse_pipeline(node, node_group, render_targets, depth_buffers):
|
|||
# Next stage
|
||||
if node.outputs[0].is_linked:
|
||||
stagenode = findNodeByLinkFrom(node_group, node, node.outputs[0])
|
||||
traverse_pipeline(stagenode, node_group, render_targets, depth_buffers)
|
||||
traverse_renderpath(stagenode, node_group, render_targets, depth_buffers)
|
||||
|
||||
def parse_render_target(node, node_group, render_targets, depth_buffers):
|
||||
if node.bl_idname == 'NodeReroute':
|
||||
|
@ -1562,7 +1562,8 @@ def make_render_target(n, scale, depth_buffer_id=None):
|
|||
target['width'] = n.inputs[1].default_value
|
||||
target['height'] = n.inputs[2].default_value
|
||||
target['format'] = n.inputs[4].default_value
|
||||
target['ping_pong'] = n.inputs[5].default_value
|
||||
if n.inputs[5].default_value:
|
||||
target['ping_pong'] = True
|
||||
if scale != 1.0:
|
||||
target['scale'] = scale
|
||||
if depth_buffer_id != None:
|
||||
|
|
|
@ -87,7 +87,7 @@ def buildNodeTree(world):
|
|||
wrd.world_defs += '_Probes'
|
||||
break
|
||||
|
||||
# Data will be written after pipeline has been processed to gather all defines
|
||||
# Data will be written after render path has been processed to gather all defines
|
||||
return output
|
||||
|
||||
def write_output(output, asset_references, shader_references):
|
||||
|
|
|
@ -2,6 +2,7 @@ import shutil
|
|||
import bpy
|
||||
import os
|
||||
import json
|
||||
import subprocess
|
||||
import nodes_renderpath
|
||||
from bpy.types import Menu, Panel, UIList
|
||||
from bpy.props import *
|
||||
|
@ -27,13 +28,21 @@ def on_scene_update(context):
|
|||
on_scene_update.last_operator = bpy.context.window_manager.operators[-1]
|
||||
make.patch_project()
|
||||
make.compile_project()
|
||||
|
||||
# New output ahs been logged
|
||||
if make.armory_log.tag_redraw:
|
||||
for area in bpy.context.screen.areas:
|
||||
if area.type == 'INFO':
|
||||
area.tag_redraw()
|
||||
on_scene_update.last_operator = None
|
||||
|
||||
def invalidate_shader_cache(self, context):
|
||||
# compiled.glsl changed, recompile all shaders next time
|
||||
fp = utils.get_fp()
|
||||
if os.path.isdir(fp + '/build/compiled/ShaderDatas'):
|
||||
shutil.rmtree(fp + '/build/compiled/ShaderDatas')
|
||||
if invalidate_shader_cache.enabled:
|
||||
fp = utils.get_fp()
|
||||
if os.path.isdir(fp + '/build/compiled/ShaderDatas'):
|
||||
shutil.rmtree(fp + '/build/compiled/ShaderDatas')
|
||||
invalidate_shader_cache.enabled = True # Disable invalidating during build process
|
||||
|
||||
def invalidate_compiled_data(self, context):
|
||||
fp = utils.get_fp()
|
||||
|
@ -105,6 +114,7 @@ def initProperties():
|
|||
bpy.types.Object.override_material = bpy.props.BoolProperty(name="Override Material", default=False)
|
||||
bpy.types.Object.override_material_name = bpy.props.StringProperty(name="Name", default="")
|
||||
bpy.types.Object.game_export = bpy.props.BoolProperty(name="Export", default=True)
|
||||
bpy.types.Object.game_visible = bpy.props.BoolProperty(name="Visible", default=True)
|
||||
bpy.types.Object.spawn = bpy.props.BoolProperty(name="Spawn", description="Auto-add this object when creating scene", default=True)
|
||||
bpy.types.Object.mobile = bpy.props.BoolProperty(name="Mobile", description="Object moves during gameplay", default=True)
|
||||
# - Clips
|
||||
|
@ -122,6 +132,7 @@ def initProperties():
|
|||
bpy.types.Mesh.mesh_cached_verts = bpy.props.IntProperty(name="Last Verts", default=0)
|
||||
bpy.types.Mesh.mesh_cached_edges = bpy.props.IntProperty(name="Last Edges", default=0)
|
||||
bpy.types.Mesh.static_usage = bpy.props.BoolProperty(name="Static Data Usage", default=True)
|
||||
bpy.types.Curve.mesh_cached = bpy.props.BoolProperty(name="Mesh Cached", default=False)
|
||||
bpy.types.Curve.static_usage = bpy.props.BoolProperty(name="Static Data Usage", default=True)
|
||||
# For armature
|
||||
bpy.types.Armature.armature_cached = bpy.props.BoolProperty(name="Armature Cached", default=False)
|
||||
|
@ -131,10 +142,10 @@ def initProperties():
|
|||
bpy.types.Armature.actiontraitlist_index = bpy.props.IntProperty(name="Index for my_list", default=0)
|
||||
# For camera
|
||||
bpy.types.Camera.frustum_culling = bpy.props.BoolProperty(name="Frustum Culling", default=True)
|
||||
bpy.types.Camera.pipeline_path = bpy.props.StringProperty(name="Render Path", default="deferred_path")
|
||||
bpy.types.Camera.pipeline_id = bpy.props.StringProperty(name="Pipeline ID", default="deferred")
|
||||
bpy.types.Camera.renderpath_path = bpy.props.StringProperty(name="Render Path", default="deferred_path")
|
||||
bpy.types.Camera.renderpath_id = bpy.props.StringProperty(name="Render Path ID", default="deferred")
|
||||
# TODO: Specify multiple material ids, merge ids from multiple cameras
|
||||
bpy.types.Camera.pipeline_passes = bpy.props.StringProperty(name="Pipeline passes", default="")
|
||||
bpy.types.Camera.renderpath_passes = bpy.props.StringProperty(name="Render Path Passes", default="")
|
||||
bpy.types.Camera.mesh_context = bpy.props.StringProperty(name="Mesh", default="mesh")
|
||||
bpy.types.Camera.mesh_context_empty = bpy.props.StringProperty(name="Mesh Empty", default="depthwrite")
|
||||
bpy.types.Camera.shadows_context = bpy.props.StringProperty(name="Shadows", default="shadowmap")
|
||||
|
@ -185,8 +196,8 @@ def initProperties():
|
|||
bpy.types.World.generate_ocean_freq = bpy.props.FloatProperty(name="Freq", default=0.16, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ocean_fade = bpy.props.FloatProperty(name="Fade", default=1.8, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssao = bpy.props.BoolProperty(name="SSAO", description="Screen-Space Ambient Occlusion", default=True, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssao_size = bpy.props.FloatProperty(name="Size", default=0.08, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssao_strength = bpy.props.FloatProperty(name="Strength", default=0.30, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssao_size = bpy.props.FloatProperty(name="Size", default=0.12, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssao_strength = bpy.props.FloatProperty(name="Strength", default=0.25, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssao_texture_scale = bpy.props.FloatProperty(name="Texture Scale", default=1.0, min=0.0, max=1.0, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_shadows = bpy.props.BoolProperty(name="Shadows", default=True, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_bloom = bpy.props.BoolProperty(name="Bloom", default=True, update=invalidate_shader_cache)
|
||||
|
@ -200,7 +211,7 @@ def initProperties():
|
|||
bpy.types.World.generate_ssr_search_dist = bpy.props.FloatProperty(name="Search Dist", default=5.0, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssr_falloff_exp = bpy.props.FloatProperty(name="Falloff Exp", default=5.0, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssr_jitter = bpy.props.FloatProperty(name="Jitter", default=0.6, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssr_texture_scale = bpy.props.FloatProperty(name="Texture Scale", default=0.5, min=0.0, max=1.0, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_ssr_texture_scale = bpy.props.FloatProperty(name="Texture Scale", default=1.0, min=0.0, max=1.0, update=invalidate_shader_cache)
|
||||
bpy.types.World.generate_pcss = bpy.props.BoolProperty(name="PCSS", description="Percentage Closer Soft Shadows", default=False, update=invalidate_shader_cache)
|
||||
# Compositor
|
||||
bpy.types.World.generate_letterbox = bpy.props.BoolProperty(name="Letterbox", default=False, update=invalidate_shader_cache)
|
||||
|
@ -269,6 +280,7 @@ class ObjectPropsPanel(bpy.types.Panel):
|
|||
return
|
||||
|
||||
layout.prop(obj, 'spawn')
|
||||
layout.prop(obj, 'game_visible')
|
||||
layout.prop(obj, 'mobile')
|
||||
if obj.type == 'MESH':
|
||||
layout.prop(obj, 'instanced_children')
|
||||
|
@ -374,7 +386,7 @@ class DataPropsPanel(bpy.types.Panel):
|
|||
layout.prop(obj.data, 'mirror_resolution_x')
|
||||
layout.prop(obj.data, 'mirror_resolution_y')
|
||||
layout.prop(obj.data, 'frustum_culling')
|
||||
layout.prop_search(obj.data, "pipeline_path", bpy.data, "node_groups")
|
||||
layout.prop_search(obj.data, "renderpath_path", bpy.data, "node_groups")
|
||||
layout.operator("arm.reimport_paths_menu")
|
||||
elif obj.type == 'MESH' or obj.type == 'FONT':
|
||||
layout.prop(obj.data, 'static_usage')
|
||||
|
@ -623,7 +635,9 @@ class ArmoryPlayButton(bpy.types.Operator):
|
|||
bl_label = 'Play'
|
||||
|
||||
def execute(self, context):
|
||||
make.play_project(False)
|
||||
invalidate_shader_cache.enabled = False
|
||||
make.play_project(self, False)
|
||||
invalidate_shader_cache.enabled = True
|
||||
return{'FINISHED'}
|
||||
|
||||
class ArmoryPlayInViewportButton(bpy.types.Operator):
|
||||
|
@ -631,6 +645,7 @@ class ArmoryPlayInViewportButton(bpy.types.Operator):
|
|||
bl_label = 'Play in Viewport'
|
||||
|
||||
def execute(self, context):
|
||||
invalidate_shader_cache.enabled = False
|
||||
if make.play_project.playproc == None:
|
||||
# Cancel viewport render
|
||||
for space in context.area.spaces:
|
||||
|
@ -638,10 +653,11 @@ class ArmoryPlayInViewportButton(bpy.types.Operator):
|
|||
if space.viewport_shade == 'RENDERED':
|
||||
space.viewport_shade = 'SOLID'
|
||||
break
|
||||
make.play_project(True)
|
||||
make.play_project(self, True)
|
||||
else:
|
||||
make.patch_project()
|
||||
make.compile_project()
|
||||
invalidate_shader_cache.enabled = True
|
||||
return{'FINISHED'}
|
||||
|
||||
class ArmoryStopButton(bpy.types.Operator):
|
||||
|
@ -657,11 +673,13 @@ class ArmoryBuildButton(bpy.types.Operator):
|
|||
bl_label = 'Build'
|
||||
|
||||
def execute(self, context):
|
||||
invalidate_shader_cache.enabled = False
|
||||
if make.play_project.playproc == None:
|
||||
make.build_project()
|
||||
else:
|
||||
make.patch_project()
|
||||
make.compile_project()
|
||||
invalidate_shader_cache.enabled = True
|
||||
return{'FINISHED'}
|
||||
|
||||
class ArmoryFolderButton(bpy.types.Operator):
|
||||
|
|
|
@ -107,7 +107,7 @@ class Main {
|
|||
static inline var projectScene = '""" + get_project_scene() + """';
|
||||
public static function main() {
|
||||
iron.sys.CompileTime.importPackage('armory.trait');
|
||||
iron.sys.CompileTime.importPackage('armory.renderpipeline');
|
||||
iron.sys.CompileTime.importPackage('armory.renderpath');
|
||||
iron.sys.CompileTime.importPackage('""" + wrd.ArmProjectPackage + """');
|
||||
#if (js && WITH_PHYSICS)
|
||||
untyped __js__("
|
||||
|
|
|
@ -70,8 +70,7 @@ vec3 getPos(float depth) {
|
|||
vec3 applyFog(vec3 rgb, float distance) {
|
||||
// float fogAmount = 1.0 - exp(-distance * compoFogAmountA);
|
||||
float fogAmount = 1.0 - exp(-distance * 0.0055);
|
||||
return mix(rgb, vec3(0.4, 0.7, 0.2), fogAmount);
|
||||
// return mix(rgb, compoFogColor, fogAmount);
|
||||
return mix(rgb, compoFogColor, fogAmount);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -30,10 +30,10 @@ in vec3 pos;
|
|||
uniform mat4 VP;
|
||||
uniform mat4 W;
|
||||
// uniform mat4 WV;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
|
||||
#ifdef _RampID
|
||||
uniform vec4 albedo_color2;
|
||||
uniform vec4 baseCol2;
|
||||
uniform int uid;
|
||||
#endif
|
||||
|
||||
|
@ -67,9 +67,9 @@ void main() {
|
|||
#ifdef _RampID
|
||||
vec2 p = vec2(float(uid), float(uid));
|
||||
float factor = hash(p);
|
||||
matColor = mix(albedo_color, albedo_color2, factor);
|
||||
matColor = mix(baseCol, baseCol2, factor);
|
||||
#else
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
#endif
|
||||
|
||||
gl_Position = wvpposition;
|
||||
|
|
|
@ -365,20 +365,52 @@
|
|||
"link": "_normalMatrix"
|
||||
},
|
||||
{
|
||||
"name": "WV",
|
||||
"link": "_worldViewMatrix"
|
||||
"name": "V",
|
||||
"link": "_viewMatrix"
|
||||
},
|
||||
{
|
||||
"name": "P",
|
||||
"link": "_projectionMatrix"
|
||||
},
|
||||
{
|
||||
"name": "lightPos",
|
||||
"link": "_lampPosition"
|
||||
},
|
||||
{
|
||||
"name": "lightDir",
|
||||
"link": "_lampDirection"
|
||||
},
|
||||
{
|
||||
"name": "lightColor",
|
||||
"link": "_lampColor"
|
||||
},
|
||||
{
|
||||
"name": "lightStrength",
|
||||
"link": "_lampStrength"
|
||||
},
|
||||
{
|
||||
"name": "spotlightCutoff",
|
||||
"link": "_spotlampCutoff"
|
||||
},
|
||||
{
|
||||
"name": "spotlightExponent",
|
||||
"link": "_spotlampExponent"
|
||||
},
|
||||
{
|
||||
"name": "lightType",
|
||||
"link": "_lampType"
|
||||
},
|
||||
{
|
||||
"name": "eye",
|
||||
"link": "_cameraPosition"
|
||||
},
|
||||
{
|
||||
"name": "skinBones",
|
||||
"link": "_skinBones",
|
||||
"ifdef": ["_Skinning"]
|
||||
},
|
||||
{
|
||||
"name": "light",
|
||||
"name": "lightPos",
|
||||
"link": "_lampPosition"
|
||||
},
|
||||
{
|
||||
|
@ -390,28 +422,27 @@
|
|||
"link": "_lampStrength"
|
||||
},
|
||||
{
|
||||
"name": "eye",
|
||||
"link": "_cameraPosition"
|
||||
},
|
||||
{
|
||||
"name": "senvmapIrradiance",
|
||||
"name": "shirr",
|
||||
"link": "_envmapIrradiance"
|
||||
},
|
||||
{
|
||||
"name": "senvmapRadiance",
|
||||
"link": "_envmapRadiance"
|
||||
"link": "_envmapRadiance",
|
||||
"ifdef": ["_Rad"]
|
||||
},
|
||||
{
|
||||
"name": "envmapNumMipmaps",
|
||||
"link": "_envmapNumMipmaps",
|
||||
"ifdef": ["_Rad"]
|
||||
},
|
||||
{
|
||||
"name": "senvmapBrdf",
|
||||
"link": "_envmapBrdf"
|
||||
"link": "_envmapBrdf",
|
||||
"ifdef": ["_Rad"]
|
||||
},
|
||||
{
|
||||
"name": "envmapStrength",
|
||||
"link": "_envmapStrength"
|
||||
},
|
||||
{
|
||||
"name": "envmapNumMipmaps",
|
||||
"link": "_envmapNumMipmaps"
|
||||
}
|
||||
],
|
||||
"texture_params": [],
|
||||
|
|
|
@ -34,7 +34,7 @@ in vec3 nor;
|
|||
|
||||
uniform mat4 WVP;
|
||||
uniform mat4 N;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
#ifdef _Billboard
|
||||
uniform mat4 WV;
|
||||
uniform mat4 P;
|
||||
|
@ -203,7 +203,7 @@ void main() {
|
|||
texCoord = tex;
|
||||
#endif
|
||||
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
|
||||
#ifdef _VCols
|
||||
matColor.rgb *= col;
|
||||
|
|
|
@ -34,10 +34,10 @@ uniform mat4 N;
|
|||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
uniform mat4 LWVP;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
uniform vec3 eye;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 12];
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
#endif
|
||||
|
||||
out vec3 position;
|
||||
|
@ -141,7 +141,7 @@ void main() {
|
|||
texCoord = tex;
|
||||
#endif
|
||||
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
|
||||
#ifdef _VCols
|
||||
matColor.rgb *= col;
|
||||
|
|
|
@ -32,7 +32,7 @@ in vec3 nor;
|
|||
|
||||
uniform mat4 LWVP;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 12];
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
#endif
|
||||
|
||||
// out vec4 position;
|
||||
|
|
|
@ -6,39 +6,50 @@ precision mediump float;
|
|||
|
||||
#include "../compiled.glsl"
|
||||
|
||||
#ifdef _NorTex
|
||||
#define _BaseTex
|
||||
#endif
|
||||
|
||||
#ifdef _BaseTex
|
||||
uniform sampler2D sbase;
|
||||
#endif
|
||||
|
||||
uniform float shirr[27];
|
||||
#ifdef _Rad
|
||||
uniform sampler2D senvmapRadiance;
|
||||
uniform sampler2D senvmapBrdf;
|
||||
uniform int envmapNumMipmaps;
|
||||
#endif
|
||||
|
||||
#ifdef _NorTex
|
||||
uniform sampler2D snormal;
|
||||
#endif
|
||||
#ifdef _NorStr
|
||||
uniform float normalStrength;
|
||||
#endif
|
||||
#ifdef _OccTex
|
||||
uniform sampler2D socclusion;
|
||||
#else
|
||||
uniform float occlusion;
|
||||
#endif
|
||||
#ifdef _RoughTex
|
||||
uniform sampler2D srough;
|
||||
#else
|
||||
uniform float roughness;
|
||||
#endif
|
||||
#ifdef _RoughStr
|
||||
uniform float roughnessStrength;
|
||||
#endif
|
||||
#ifdef _MetTex
|
||||
uniform sampler2D smetal;
|
||||
#else
|
||||
uniform float metalness;
|
||||
#endif
|
||||
uniform float mask;
|
||||
|
||||
uniform sampler2D senvmapRadiance;
|
||||
uniform sampler2D senvmapIrradiance;
|
||||
uniform sampler2D senvmapBrdf;
|
||||
uniform float envmapStrength;
|
||||
uniform int envmapNumMipmaps;
|
||||
uniform vec3 light;
|
||||
uniform vec3 lightPos;
|
||||
uniform vec3 lightDir;
|
||||
uniform int lightType;
|
||||
uniform vec3 lightColor;
|
||||
uniform float lightStrength;
|
||||
uniform float spotlightCutoff;
|
||||
uniform float spotlightExponent;
|
||||
uniform vec3 eye;
|
||||
|
||||
in vec4 wvpposition;
|
||||
|
@ -46,8 +57,8 @@ in vec3 position;
|
|||
#ifdef _Tex
|
||||
in vec2 texCoord;
|
||||
#endif
|
||||
in vec4 lPos;
|
||||
in vec4 matColor;
|
||||
in vec3 eyeDir;
|
||||
#ifdef _NorTex
|
||||
in mat3 TBN;
|
||||
#else
|
||||
|
@ -55,16 +66,48 @@ in vec4 matColor;
|
|||
#endif
|
||||
out vec4[2] outColor;
|
||||
|
||||
vec3 shIrradiance(vec3 nor, float scale) {
|
||||
const float c1 = 0.429043;
|
||||
const float c2 = 0.511664;
|
||||
const float c3 = 0.743125;
|
||||
const float c4 = 0.886227;
|
||||
const float c5 = 0.247708;
|
||||
vec3 cl00, cl1m1, cl10, cl11, cl2m2, cl2m1, cl20, cl21, cl22;
|
||||
cl00 = vec3(shirr[0], shirr[1], shirr[2]);
|
||||
cl1m1 = vec3(shirr[3], shirr[4], shirr[5]);
|
||||
cl10 = vec3(shirr[6], shirr[7], shirr[8]);
|
||||
cl11 = vec3(shirr[9], shirr[10], shirr[11]);
|
||||
cl2m2 = vec3(shirr[12], shirr[13], shirr[14]);
|
||||
cl2m1 = vec3(shirr[15], shirr[16], shirr[17]);
|
||||
cl20 = vec3(shirr[18], shirr[19], shirr[20]);
|
||||
cl21 = vec3(shirr[21], shirr[22], shirr[23]);
|
||||
cl22 = vec3(shirr[24], shirr[25], shirr[26]);
|
||||
return (
|
||||
c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) +
|
||||
c3 * cl20 * nor.x * nor.x +
|
||||
c4 * cl00 -
|
||||
c5 * cl20 +
|
||||
2.0 * c1 * cl2m2 * nor.y * (-nor.z) +
|
||||
2.0 * c1 * cl21 * nor.y * nor.x +
|
||||
2.0 * c1 * cl2m1 * (-nor.z) * nor.x +
|
||||
2.0 * c2 * cl11 * nor.y +
|
||||
2.0 * c2 * cl1m1 * (-nor.z) +
|
||||
2.0 * c2 * cl10 * nor.x
|
||||
) * scale;
|
||||
}
|
||||
|
||||
vec2 envMapEquirect(vec3 normal) {
|
||||
float phi = acos(normal.z);
|
||||
float theta = atan(-normal.y, normal.x) + PI;
|
||||
return vec2(theta / PI2, phi / PI);
|
||||
}
|
||||
|
||||
#ifdef _Rad
|
||||
float getMipLevelFromRoughness(float roughness) {
|
||||
// First mipmap level = roughness 0, last = roughness = 1
|
||||
return roughness * envmapNumMipmaps;
|
||||
}
|
||||
#endif
|
||||
|
||||
vec3 surfaceAlbedo(vec3 baseColor, float metalness) {
|
||||
return mix(baseColor, vec3(0.0), metalness);
|
||||
|
@ -102,7 +145,6 @@ vec3 diffuseBRDF(vec3 albedo, float roughness, float nv, float nl, float vh, flo
|
|||
return lambert(albedo, nl);
|
||||
}
|
||||
|
||||
|
||||
void main() {
|
||||
|
||||
#ifdef _NorTex
|
||||
|
@ -111,8 +153,21 @@ void main() {
|
|||
#else
|
||||
vec3 n = normalize(normal);
|
||||
#endif
|
||||
#ifdef _NorStr
|
||||
n *= normalStrength;
|
||||
#endif
|
||||
|
||||
vec4 baseColor = matColor;
|
||||
// Move out
|
||||
vec3 l;
|
||||
if (lightType == 0) { // Sun
|
||||
l = lightDir;
|
||||
}
|
||||
else { // Point, spot
|
||||
l = normalize(lightPos - position.xyz);
|
||||
}
|
||||
float dotNL = max(dot(n, l), 0.0);
|
||||
|
||||
vec3 baseColor = matColor.rgb;
|
||||
#ifdef _BaseTex
|
||||
vec4 texel = texture(sbase, texCoord);
|
||||
#ifdef _AlphaTest
|
||||
|
@ -120,71 +175,79 @@ void main() {
|
|||
discard;
|
||||
#endif
|
||||
texel.rgb = pow(texel.rgb, vec3(2.2));
|
||||
baseColor *= texel;
|
||||
baseColor *= texel.rgb;
|
||||
#endif
|
||||
|
||||
#ifdef _MetTex
|
||||
float metalness = texture(smetal, texCoord).r;
|
||||
#endif
|
||||
|
||||
#ifdef _RoughTex
|
||||
float roughness = texture(srough, texCoord).r;
|
||||
#endif
|
||||
|
||||
#ifdef _OccTex
|
||||
float occlusion = texture(socclusion, texCoord).r;
|
||||
#else
|
||||
float occlusion = 1.0;
|
||||
#endif
|
||||
|
||||
|
||||
vec3 lightDir = light - position.xyz;
|
||||
vec3 eyeDir = eye - position.xyz;
|
||||
vec3 l = normalize(lightDir);
|
||||
vec3 v = normalize(eyeDir);
|
||||
vec3 h = normalize(v + l);
|
||||
|
||||
float dotNL = max(dot(n, l), 0.0);
|
||||
float dotNV = max(dot(n, v), 0.0);
|
||||
float dotNH = max(dot(n, h), 0.0);
|
||||
float dotVH = max(dot(v, h), 0.0);
|
||||
float dotLV = max(dot(l, v), 0.0);
|
||||
float dotLH = max(dot(l, h), 0.0);
|
||||
|
||||
vec3 albedo = surfaceAlbedo(baseColor.rgb, metalness);
|
||||
vec3 f0 = surfaceF0(baseColor.rgb, metalness);
|
||||
|
||||
|
||||
#ifdef _MetTex
|
||||
float metalness = texture(smetal, texCoord).r;
|
||||
#endif
|
||||
vec3 albedo = surfaceAlbedo(baseColor, metalness);
|
||||
vec3 f0 = surfaceF0(baseColor, metalness);
|
||||
|
||||
#ifdef _RoughTex
|
||||
float roughness = texture(srough, texCoord).r;
|
||||
#endif
|
||||
#ifdef _RoughStr
|
||||
roughness *= roughnessStrength;
|
||||
#endif
|
||||
|
||||
// Direct
|
||||
vec3 direct = diffuseBRDF(albedo, roughness, dotNV, dotNL, dotVH, dotLV) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH, dotLH);
|
||||
vec3 direct = diffuseBRDF(albedo, roughness, dotNV, dotNL, dotVH, dotLV) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH, dotLH);
|
||||
|
||||
if (lightType == 2) { // Spot
|
||||
float spotEffect = dot(lightDir, l);
|
||||
if (spotEffect < spotlightCutoff) {
|
||||
spotEffect = smoothstep(spotlightCutoff - spotlightExponent, spotlightCutoff, spotEffect);
|
||||
direct *= spotEffect;
|
||||
}
|
||||
}
|
||||
|
||||
direct = direct * lightColor * lightStrength;
|
||||
|
||||
// Indirect
|
||||
vec3 indirectDiffuse = texture(senvmapIrradiance, envMapEquirect(n)).rgb;
|
||||
// indirectDiffuse = pow(indirectDiffuse, vec3(2.2));
|
||||
vec3 indirectDiffuse = shIrradiance(n, 2.2) / PI;
|
||||
#ifdef _EnvLDR
|
||||
indirectDiffuse = pow(indirectDiffuse, vec3(2.2));
|
||||
#endif
|
||||
indirectDiffuse *= albedo;
|
||||
vec3 indirect = indirectDiffuse;
|
||||
|
||||
#ifdef _Rad
|
||||
vec3 reflectionWorld = reflect(-v, n);
|
||||
float lod = getMipLevelFromRoughness(roughness);// + 1.0;
|
||||
vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb;
|
||||
// prefilteredColor = pow(prefilteredColor, vec3(2.2));
|
||||
|
||||
#ifdef _EnvLDR
|
||||
prefilteredColor = pow(prefilteredColor, vec3(2.2));
|
||||
#endif
|
||||
vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;
|
||||
vec3 indirectSpecular = prefilteredColor * (f0 * envBRDF.x + envBRDF.y);
|
||||
vec3 indirect = indirectDiffuse + indirectSpecular;
|
||||
indirect = indirect * lightColor * lightStrength * envmapStrength;
|
||||
indirect += indirectSpecular;
|
||||
#endif
|
||||
indirect = indirect * envmapStrength;// * lightColor * lightStrength;
|
||||
|
||||
vec4 premultipliedReflect = vec4(vec3(direct + indirect * occlusion), baseColor.a);
|
||||
|
||||
|
||||
vec4 premultipliedReflect = vec4(vec3(direct + indirect * occlusion), matColor.a);
|
||||
// vec4 premultipliedReflect = vec4(1.0, 0.0, 0.0, 0.01);
|
||||
// vec4 premultipliedReflect = baseColor;
|
||||
|
||||
float fragZ = wvpposition.z / wvpposition.w;
|
||||
float a = min(1.0, premultipliedReflect.a) * 8.0 + 0.01;
|
||||
float b = -fragZ * 0.95 + 1.0;
|
||||
float w = clamp(a * a * a * 1e8 * b * b * b, 1e-2, 3e2);
|
||||
// accum = premultipliedReflect * w;
|
||||
// revealage = premultipliedReflect.a;
|
||||
// RT0 = vec4(C*w, a)
|
||||
// RT1 = vec4(vec3(a*w), 1)
|
||||
// RT0 = vec4(C * w, a)
|
||||
// RT1 = vec4(vec3(a * w), 1)
|
||||
outColor[0] = vec4(premultipliedReflect.rgb * w, premultipliedReflect.a);
|
||||
outColor[1] = vec4(vec3(premultipliedReflect.a * w), 1.0);
|
||||
outColor[1] = vec4(premultipliedReflect.a * w, 0.0, 0.0, 1.0);
|
||||
}
|
||||
|
|
|
@ -6,10 +6,6 @@ precision highp float;
|
|||
|
||||
#include "../compiled.glsl"
|
||||
|
||||
#ifdef _NorTex
|
||||
#define _BaseTex
|
||||
#endif
|
||||
|
||||
in vec3 pos;
|
||||
in vec3 nor;
|
||||
#ifdef _BaseTex
|
||||
|
@ -31,12 +27,12 @@ in vec3 nor;
|
|||
|
||||
uniform mat4 W;
|
||||
uniform mat4 N;
|
||||
uniform mat4 WV;
|
||||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
uniform mat4 LWVP;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
uniform vec3 eye;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 12];
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
#endif
|
||||
|
||||
out vec4 wvpposition;
|
||||
|
@ -46,6 +42,7 @@ out vec3 position;
|
|||
#endif
|
||||
out vec4 lPos;
|
||||
out vec4 matColor;
|
||||
out vec3 eyeDir;
|
||||
#ifdef _NorTex
|
||||
out mat3 TBN;
|
||||
#else
|
||||
|
@ -120,7 +117,7 @@ void main() {
|
|||
vec3 _normal = normalize(mat3(N) * nor);
|
||||
#endif
|
||||
|
||||
lPos = LWVP * sPos;
|
||||
mat4 WV = V * W;
|
||||
|
||||
#ifdef _Billboard
|
||||
// Spherical
|
||||
|
@ -132,20 +129,22 @@ void main() {
|
|||
//WV[2][0] = 0.0; WV[2][1] = 0.0; WV[2][2] = 1.0;
|
||||
#endif
|
||||
|
||||
position = vec4(W * sPos).xyz;
|
||||
gl_Position = P * WV * sPos;
|
||||
wvpposition = gl_Position;
|
||||
|
||||
#ifdef _BaseTex
|
||||
#ifdef _Tex
|
||||
texCoord = tex;
|
||||
#endif
|
||||
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
|
||||
#ifdef _VCols
|
||||
matColor.rgb *= col;
|
||||
#endif
|
||||
|
||||
wvpposition = gl_Position;
|
||||
vec3 mPos = vec4(W * sPos).xyz;
|
||||
position = mPos;
|
||||
eyeDir = eye - mPos;
|
||||
|
||||
#ifdef _NorTex
|
||||
vec3 tangent = (mat3(N) * (tan));
|
||||
|
|
2
raw/env/env.frag.glsl
vendored
2
raw/env/env.frag.glsl
vendored
|
@ -190,10 +190,12 @@ void main() {
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _EnvSky // Prevent case when sky radiance is enabled
|
||||
#ifdef _EnvTex
|
||||
vec3 n = normalize(normal);
|
||||
vec3 R = texture(envmap, envMapEquirect(n)).rgb * envmapStrength;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _EnvSky
|
||||
vec3 n = normalize(normal);
|
||||
|
|
|
@ -6,10 +6,6 @@ precision mediump float;
|
|||
|
||||
#include "../compiled.glsl"
|
||||
|
||||
// #ifdef _NorTex
|
||||
// #define _Tex
|
||||
// #endif
|
||||
|
||||
#ifdef _BaseTex
|
||||
uniform sampler2D sbase;
|
||||
#endif
|
||||
|
|
|
@ -30,7 +30,7 @@ uniform mat4 N;
|
|||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
uniform mat4 LWVP;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
uniform vec3 eye;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
|
@ -171,7 +171,7 @@ void main() {
|
|||
texCoord = tex;
|
||||
#endif
|
||||
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
|
||||
#ifdef _VCols
|
||||
matColor.rgb *= col;
|
||||
|
|
|
@ -34,10 +34,10 @@ uniform mat4 N;
|
|||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
uniform mat4 LWVP;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
uniform vec3 eye;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 12];
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
#endif
|
||||
|
||||
out vec3 position;
|
||||
|
@ -141,7 +141,7 @@ void main() {
|
|||
texCoord = tex;
|
||||
#endif
|
||||
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
|
||||
#ifdef _VCols
|
||||
matColor.rgb *= col;
|
||||
|
|
|
@ -32,7 +32,7 @@ in vec3 nor;
|
|||
|
||||
uniform mat4 LWVP;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 12];
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
#endif
|
||||
|
||||
// out vec4 position;
|
||||
|
|
|
@ -31,7 +31,7 @@ uniform mat4 V;
|
|||
uniform mat4 P;
|
||||
uniform mat4 WVP;
|
||||
uniform mat4 LWVP;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
uniform vec3 eye;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
|
@ -139,7 +139,7 @@ void main() {
|
|||
texCoord = tex;
|
||||
#endif
|
||||
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
|
||||
#ifdef _VCols
|
||||
matColor.rgb *= col;
|
||||
|
|
|
@ -34,7 +34,7 @@ uniform mat4 N;
|
|||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
uniform mat4 LWVP;
|
||||
uniform vec4 albedo_color;
|
||||
uniform vec4 baseCol;
|
||||
uniform vec3 eye;
|
||||
#ifdef _Skinning
|
||||
uniform float skinBones[skinMaxBones * 8];
|
||||
|
@ -141,7 +141,7 @@ void main() {
|
|||
texCoord = tex;
|
||||
#endif
|
||||
|
||||
matColor = albedo_color;
|
||||
matColor = baseCol;
|
||||
|
||||
#ifdef _VCols
|
||||
matColor.rgb *= col;
|
||||
|
|
|
@ -5,23 +5,24 @@
|
|||
precision mediump float;
|
||||
#endif
|
||||
|
||||
// uniform sampler2D gbufferD;
|
||||
uniform sampler2D saccum; // accumTexture
|
||||
uniform sampler2D srevealage; // revealageTexture
|
||||
uniform sampler2D gbufferD;
|
||||
uniform sampler2D gbuffer0; // saccum
|
||||
uniform sampler2D gbuffer1; // srevealage
|
||||
|
||||
in vec2 texCoord;
|
||||
out vec4 outColor;
|
||||
|
||||
void main() {
|
||||
vec4 accum = texture(saccum, texCoord);
|
||||
vec4 accum = texture(gbuffer0, texCoord);
|
||||
float revealage = accum.a;
|
||||
|
||||
|
||||
if (revealage == 1.0) {
|
||||
// Save the blending and color texture fetch cost
|
||||
discard;
|
||||
}
|
||||
|
||||
float accumA = texture(srevealage, texCoord).r;
|
||||
float accumA = texture(gbuffer1, texCoord).r;
|
||||
// accum.a = texture(gbuffer1, texCoord).r;
|
||||
|
||||
// outColor = vec4(accum.rgb / clamp(accum.a, 1e-4, 5e4), revealage);
|
||||
|
||||
|
|
|
@ -190,5 +190,7 @@ void main() {
|
|||
// }
|
||||
|
||||
// curOpticalDepth
|
||||
outColor = vec4(scatteredLightAmount * lightColor.rgb * lightStrength, 0.0);
|
||||
// outColor = vec4(scatteredLightAmount * lightColor.rgb * max(1.0, lightStrength / 2.0), 0.0);
|
||||
outColor = vec4(scatteredLightAmount * lightColor.rgb, 0.0);
|
||||
// outColor = vec4(scatteredLightAmount * lightColor.rgb * ((1.0 - depth) * 10.0), 0.0);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue