Load resources from blend file

This commit is contained in:
Lubos Lenco 2016-02-08 12:03:20 +01:00
parent d74fa3c777
commit 574eae7f7b
8 changed files with 56 additions and 105 deletions

View 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": []
}
]
}
]
}

View file

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

BIN
blender/data/data.blend Normal file

Binary file not shown.

BIN
blender/data/data.blend1 Normal file

Binary file not shown.

View file

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

View file

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

View file

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

View file

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