Load resources from blend file
This commit is contained in:
parent
d74fa3c777
commit
574eae7f7b
16
Assets/deferred_material.json
Normal file
16
Assets/deferred_material.json
Normal file
|
@ -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": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"material_resources": [
|
"material_resources": [
|
||||||
{
|
{
|
||||||
"id": "material1",
|
"id": "env_material",
|
||||||
"shader": "env_map/env_map",
|
"shader": "env_map/env_map",
|
||||||
"cast_shadow": true,
|
"cast_shadow": true,
|
||||||
"contexts": [
|
"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": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
BIN
blender/data/data.blend
Normal file
BIN
blender/data/data.blend
Normal file
Binary file not shown.
BIN
blender/data/data.blend1
Normal file
BIN
blender/data/data.blend1
Normal file
Binary file not shown.
|
@ -233,6 +233,7 @@ def buildNodeTrees():
|
||||||
# Export node scripts
|
# Export node scripts
|
||||||
for node_group in bpy.data.node_groups:
|
for node_group in bpy.data.node_groups:
|
||||||
if node_group.bl_idname == 'CGTreeType': # Build only cycles game trees
|
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)
|
buildNodeTree(node_group)
|
||||||
|
|
||||||
def buildNodeTree(node_group):
|
def buildNodeTree(node_group):
|
||||||
|
|
|
@ -4,6 +4,8 @@ from bpy.props import *
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
|
import platform
|
||||||
|
import subprocess
|
||||||
|
|
||||||
class CGPipelineTree(NodeTree):
|
class CGPipelineTree(NodeTree):
|
||||||
'''Pipeline nodes'''
|
'''Pipeline nodes'''
|
||||||
|
@ -170,88 +172,35 @@ node_categories = [
|
||||||
]),
|
]),
|
||||||
]
|
]
|
||||||
|
|
||||||
def reset_pipelines():
|
def reload_blend_data():
|
||||||
if bpy.data.node_groups.get('forward_pipeline') == None:
|
if bpy.data.node_groups.get('forward_pipeline') == None:
|
||||||
make_forward_pipeline()
|
load_library()
|
||||||
if bpy.data.node_groups.get('deferred_pipeline') == None:
|
pass
|
||||||
make_deferred_pipeline()
|
|
||||||
|
|
||||||
def make_forward_pipeline():
|
def load_library():
|
||||||
step = 170
|
haxelib_path = "haxelib"
|
||||||
pipe = bpy.data.node_groups.new(name='forward_pipeline', type='CGPipelineTreeType')
|
if platform.system() == 'Darwin':
|
||||||
nodes = pipe.nodes
|
haxelib_path = "/usr/local/bin/haxelib"
|
||||||
links = pipe.links
|
|
||||||
|
|
||||||
framebuffer_node = nodes.new('FramebufferNodeType')
|
output = subprocess.check_output([haxelib_path + " path cyclesgame"], shell=True)
|
||||||
framebuffer_node.location = 0, 0
|
output = str(output).split("\\n")[0].split("'")[1]
|
||||||
|
data_path = output[:-8] + "blender/data/data.blend" # Remove 'Sources/' from haxelib path
|
||||||
|
|
||||||
settarget_node = nodes.new('SetTargetNodeType')
|
with bpy.data.libraries.load(data_path, link=False) as (data_from, data_to):
|
||||||
settarget_node.location = step * 1, 0
|
data_to.node_groups = ['forward_pipeline', 'forward_pipeline_noshadow', 'deferred_pipeline', 'CG PBR']
|
||||||
links.new(framebuffer_node.outputs[0], settarget_node.inputs[1])
|
|
||||||
|
|
||||||
cleartarget_node = nodes.new('ClearTargetNodeType')
|
# TODO: cannot use for loop
|
||||||
cleartarget_node.location = step * 2, 0
|
# TODO: import pbr group separately, no need for fake user
|
||||||
cleartarget_node.inputs[1].default_value = True # Color
|
bpy.data.node_groups['forward_pipeline'].use_fake_user = True
|
||||||
cleartarget_node.inputs[2].default_value = True # Depth
|
bpy.data.node_groups['forward_pipeline_noshadow'].use_fake_user = True
|
||||||
links.new(settarget_node.outputs[0], cleartarget_node.inputs[0])
|
bpy.data.node_groups['deferred_pipeline'].use_fake_user = True
|
||||||
|
bpy.data.node_groups['CG PBR'].use_fake_user = True
|
||||||
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])
|
|
||||||
|
|
||||||
def make_deferred_pipeline():
|
|
||||||
step = 170
|
|
||||||
pipe = bpy.data.node_groups.new(name='deferred_pipeline', type='CGPipelineTreeType')
|
|
||||||
nodes = pipe.nodes
|
|
||||||
links = pipe.links
|
|
||||||
|
|
||||||
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])
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
bpy.utils.register_module(__name__)
|
bpy.utils.register_module(__name__)
|
||||||
try:
|
try:
|
||||||
nodeitems_utils.register_node_categories("CG_PIPELINE_NODES", node_categories)
|
nodeitems_utils.register_node_categories("CG_PIPELINE_NODES", node_categories)
|
||||||
reset_pipelines()
|
reload_blend_data()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -373,4 +322,3 @@ def get_render_targets(node_group):
|
||||||
target.format = n.inputs[5].default_value
|
target.format = n.inputs[5].default_value
|
||||||
render_targets.append(target)
|
render_targets.append(target)
|
||||||
return render_targets
|
return render_targets
|
||||||
|
|
||||||
|
|
|
@ -9,16 +9,15 @@ precision mediump float;
|
||||||
|
|
||||||
uniform sampler2D envmap;
|
uniform sampler2D envmap;
|
||||||
|
|
||||||
in vec3 wcNormal;
|
in vec3 normal;
|
||||||
|
|
||||||
vec2 envMapEquirect(vec3 wcNormal, float flipEnvMap) {
|
vec2 envMapEquirect(vec3 normal) {
|
||||||
float phi = acos(wcNormal.z);
|
float phi = acos(normal.z);
|
||||||
float theta = atan(flipEnvMap * wcNormal.x, wcNormal.y) + PI;
|
float theta = atan(normal.x, normal.y) + PI;
|
||||||
return vec2(theta / TwoPI, phi / PI);
|
return vec2(theta / TwoPI, phi / PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
vec3 n = normalize(normal);
|
||||||
vec3 N = normalize(wcNormal);
|
gl_FragColor = texture(envmap, envMapEquirect(n));
|
||||||
gl_FragColor = texture(envmap, envMapEquirect(N, -1.0));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,9 +9,15 @@ uniform mat4 P;
|
||||||
|
|
||||||
in vec2 pos;
|
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
|
float
|
||||||
a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],
|
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],
|
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;
|
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() {
|
void main() {
|
||||||
|
|
||||||
mat4 invP = inverse(P);
|
mat4 invP = inverse_(P);
|
||||||
mat3 invMV = transpose(mat3(V));
|
mat3 invMV = transpose_(mat3(V));
|
||||||
|
|
||||||
vec4 p = vec4(pos.xy, 0.0, 1.0);
|
vec4 p = vec4(pos.xy, 0.0, 1.0);
|
||||||
|
|
||||||
vec3 unprojected = (invP * p).xyz;
|
vec3 unprojected = (invP * p).xyz;
|
||||||
|
|
||||||
wcNormal = invMV * unprojected;
|
normal = invMV * unprojected;
|
||||||
|
|
||||||
gl_Position = vec4(pos.xy, 0.0, 1.0);
|
gl_Position = vec4(pos.xy, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue