Fix translucent, redirect traces to Blender.

This commit is contained in:
Lubos Lenco 2016-09-05 17:03:20 +02:00
parent db00e84343
commit cd2e936fcf
31 changed files with 342 additions and 213 deletions

View file

@ -1,4 +1,4 @@
package armory.renderpipeline;
package armory.renderpath;
import iron.data.RenderPath;

View file

@ -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;

View file

@ -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 {

View file

@ -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) {

View file

@ -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;
}
}

View file

@ -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.

View file

@ -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)

View file

@ -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 = []

View file

@ -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:

View file

@ -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:

View file

@ -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):

View file

@ -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):

View file

@ -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__("

View file

@ -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

View file

@ -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;

View file

@ -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": [],

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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);
}

View file

@ -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));

View file

@ -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);

View file

@ -6,10 +6,6 @@ precision mediump float;
#include "../compiled.glsl"
// #ifdef _NorTex
// #define _Tex
// #endif
#ifdef _BaseTex
uniform sampler2D sbase;
#endif

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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);
}