diff --git a/Assets/deferred_material.json b/Assets/deferred_material.json new file mode 100644 index 00000000..231e2120 --- /dev/null +++ b/Assets/deferred_material.json @@ -0,0 +1,16 @@ +{ + "material_resources": [ + { + "id": "material_deferred", + "shader": "deferred_pass_resource/deferred_pass", + "cast_shadow": true, + "contexts": [ + { + "id": "deferred_pass", + "bind_constants": [], + "bind_textures": [] + } + ] + } + ] +} diff --git a/Assets/material_resource.json b/Assets/env_material.json similarity index 55% rename from Assets/material_resource.json rename to Assets/env_material.json index a22fb838..abf73fcb 100644 --- a/Assets/material_resource.json +++ b/Assets/env_material.json @@ -1,7 +1,7 @@ { "material_resources": [ { - "id": "material1", + "id": "env_material", "shader": "env_map/env_map", "cast_shadow": true, "contexts": [ @@ -16,18 +16,6 @@ ] } ] - }, - { - "id": "material_deferred", - "shader": "deferred_pass_resource/deferred_pass", - "cast_shadow": true, - "contexts": [ - { - "id": "deferred_pass", - "bind_constants": [], - "bind_textures": [] - } - ] } ] } diff --git a/blender/data/data.blend b/blender/data/data.blend new file mode 100644 index 00000000..a6cf38f9 Binary files /dev/null and b/blender/data/data.blend differ diff --git a/blender/data/data.blend1 b/blender/data/data.blend1 new file mode 100644 index 00000000..042a7ae6 Binary files /dev/null and b/blender/data/data.blend1 differ diff --git a/blender/nodes_logic.py b/blender/nodes_logic.py index 4bc9ec92..24efc18c 100755 --- a/blender/nodes_logic.py +++ b/blender/nodes_logic.py @@ -233,6 +233,7 @@ def buildNodeTrees(): # Export node scripts for node_group in bpy.data.node_groups: if node_group.bl_idname == 'CGTreeType': # Build only cycles game trees + node_group.use_fake_user = True # Keep fake references for now buildNodeTree(node_group) def buildNodeTree(node_group): diff --git a/blender/nodes_pipeline.py b/blender/nodes_pipeline.py index d48e2648..cf12906e 100755 --- a/blender/nodes_pipeline.py +++ b/blender/nodes_pipeline.py @@ -4,6 +4,8 @@ from bpy.props import * import os import sys import json +import platform +import subprocess class CGPipelineTree(NodeTree): '''Pipeline nodes''' @@ -170,88 +172,35 @@ node_categories = [ ]), ] -def reset_pipelines(): +def reload_blend_data(): if bpy.data.node_groups.get('forward_pipeline') == None: - make_forward_pipeline() - if bpy.data.node_groups.get('deferred_pipeline') == None: - make_deferred_pipeline() + load_library() + pass -def make_forward_pipeline(): - step = 170 - pipe = bpy.data.node_groups.new(name='forward_pipeline', type='CGPipelineTreeType') - nodes = pipe.nodes - links = pipe.links +def load_library(): + haxelib_path = "haxelib" + if platform.system() == 'Darwin': + haxelib_path = "/usr/local/bin/haxelib" - framebuffer_node = nodes.new('FramebufferNodeType') - framebuffer_node.location = 0, 0 - - settarget_node = nodes.new('SetTargetNodeType') - settarget_node.location = step * 1, 0 - links.new(framebuffer_node.outputs[0], settarget_node.inputs[1]) - - cleartarget_node = nodes.new('ClearTargetNodeType') - cleartarget_node.location = step * 2, 0 - cleartarget_node.inputs[1].default_value = True # Color - cleartarget_node.inputs[2].default_value = True # Depth - links.new(settarget_node.outputs[0], cleartarget_node.inputs[0]) - - drawgeometry_node = nodes.new('DrawGeometryNodeType') - drawgeometry_node.location = step * 3, 0 - drawgeometry_node.inputs[1].default_value = 'forward' # Context - links.new(cleartarget_node.outputs[0], drawgeometry_node.inputs[0]) + output = subprocess.check_output([haxelib_path + " path cyclesgame"], shell=True) + output = str(output).split("\\n")[0].split("'")[1] + data_path = output[:-8] + "blender/data/data.blend" # Remove 'Sources/' from haxelib path -def make_deferred_pipeline(): - step = 170 - pipe = bpy.data.node_groups.new(name='deferred_pipeline', type='CGPipelineTreeType') - nodes = pipe.nodes - links = pipe.links + with bpy.data.libraries.load(data_path, link=False) as (data_from, data_to): + data_to.node_groups = ['forward_pipeline', 'forward_pipeline_noshadow', 'deferred_pipeline', 'CG PBR'] - gbuffer_node = nodes.new('TargetNodeType') - gbuffer_node.location = 0, -step * 1 - gbuffer_node.inputs[0].default_value = 'gbuffer' # Id - gbuffer_node.inputs[3].default_value = 3 # Color buffers - gbuffer_node.inputs[4].default_value = True # Depth - gbuffer_node.inputs[5].default_value = 'RGBA128' # Format - - setgbuffer_node = nodes.new('SetTargetNodeType') - setgbuffer_node.location = step * 1, 0 - links.new(gbuffer_node.outputs[0], setgbuffer_node.inputs[1]) - - cleargbuffer_node = nodes.new('ClearTargetNodeType') - cleargbuffer_node.location = step * 2, 0 - cleargbuffer_node.inputs[1].default_value = True # Color - cleargbuffer_node.inputs[2].default_value = True # Depth - links.new(setgbuffer_node.outputs[0], cleargbuffer_node.inputs[0]) - - drawgbuffer_node = nodes.new('DrawGeometryNodeType') - drawgbuffer_node.location = step * 3, 0 - drawgbuffer_node.inputs[1].default_value = 'deferred' # Context - links.new(cleargbuffer_node.outputs[0], drawgbuffer_node.inputs[0]) - - framebuffer_node = nodes.new('FramebufferNodeType') - framebuffer_node.location = step * 3, -step * 1 - - setframebuffer_node = nodes.new('SetTargetNodeType') - setframebuffer_node.location = step * 4, 0 - links.new(drawgbuffer_node.outputs[0], setframebuffer_node.inputs[0]) - links.new(framebuffer_node.outputs[0], setframebuffer_node.inputs[1]) - - bindgbuffer_node = nodes.new('BindTargetNodeType') - bindgbuffer_node.location = step * 5, -step * 1 - drawgbuffer_node.inputs[2].default_value = 'gbuffer' # Constant - links.new(setframebuffer_node.outputs[0], bindgbuffer_node.inputs[0]) - links.new(gbuffer_node.outputs[0], bindgbuffer_node.inputs[1]) - - drawquad_node = nodes.new('DrawQuadNodeType') - drawquad_node.location = step * 6, -step * 1 - drawquad_node.inputs[1].default_value = 'final_pass' # Material context - links.new(bindgbuffer_node.outputs[0], drawquad_node.inputs[0]) + # TODO: cannot use for loop + # TODO: import pbr group separately, no need for fake user + bpy.data.node_groups['forward_pipeline'].use_fake_user = True + bpy.data.node_groups['forward_pipeline_noshadow'].use_fake_user = True + bpy.data.node_groups['deferred_pipeline'].use_fake_user = True + bpy.data.node_groups['CG PBR'].use_fake_user = True def register(): bpy.utils.register_module(__name__) try: nodeitems_utils.register_node_categories("CG_PIPELINE_NODES", node_categories) - reset_pipelines() + reload_blend_data() except: pass @@ -373,4 +322,3 @@ def get_render_targets(node_group): target.format = n.inputs[5].default_value render_targets.append(target) return render_targets - diff --git a/raw/env_map/env_map.frag.glsl b/raw/env_map/env_map.frag.glsl index 12d2e263..d669e9ee 100644 --- a/raw/env_map/env_map.frag.glsl +++ b/raw/env_map/env_map.frag.glsl @@ -9,16 +9,15 @@ precision mediump float; uniform sampler2D envmap; -in vec3 wcNormal; +in vec3 normal; -vec2 envMapEquirect(vec3 wcNormal, float flipEnvMap) { - float phi = acos(wcNormal.z); - float theta = atan(flipEnvMap * wcNormal.x, wcNormal.y) + PI; +vec2 envMapEquirect(vec3 normal) { + float phi = acos(normal.z); + float theta = atan(normal.x, normal.y) + PI; return vec2(theta / TwoPI, phi / PI); } void main() { - - vec3 N = normalize(wcNormal); - gl_FragColor = texture(envmap, envMapEquirect(N, -1.0)); + vec3 n = normalize(normal); + gl_FragColor = texture(envmap, envMapEquirect(n)); } diff --git a/raw/env_map/env_map.vert.glsl b/raw/env_map/env_map.vert.glsl index 1fc8c267..51fe19d8 100644 --- a/raw/env_map/env_map.vert.glsl +++ b/raw/env_map/env_map.vert.glsl @@ -9,9 +9,15 @@ uniform mat4 P; in vec2 pos; -out vec3 wcNormal; +out vec3 normal; -mat4 inverse(mat4 m) { +mat3 transpose_(mat3 m) { + return mat3(m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); +} + +mat4 inverse_(mat4 m) { float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], @@ -52,22 +58,15 @@ mat4 inverse(mat4 m) { a20 * b03 - a21 * b01 + a22 * b00) / det; } -// mat3 transpose(mat3 m) { -// return mat3(m[0][0], m[1][0], m[2][0], -// m[0][1], m[1][1], m[2][1], -// m[0][2], m[1][2], m[2][2]); -// } - void main() { - mat4 invP = inverse(P); - mat3 invMV = transpose(mat3(V)); + mat4 invP = inverse_(P); + mat3 invMV = transpose_(mat3(V)); vec4 p = vec4(pos.xy, 0.0, 1.0); - vec3 unprojected = (invP * p).xyz; - wcNormal = invMV * unprojected; + normal = invMV * unprojected; gl_Position = vec4(pos.xy, 0.0, 1.0); }