More GPU particles

This commit is contained in:
Lubos Lenco 2017-09-28 00:48:57 +02:00
parent ece7eb40c6
commit 9307f57779
5 changed files with 38 additions and 7 deletions

View file

@ -16,7 +16,7 @@ vec2 envMapEquirect(const vec3 normal) {
}
float rand(const vec2 co) { // Unreliable
return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);
return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
}
vec2 rand2(const vec2 coord) {

View file

@ -2289,6 +2289,9 @@ class ArmoryExporter:
o = {}
o['name'] = materialRef[1]["structName"]
if material.arm_skip_context != '':
o['skip_context'] = material.arm_skip_context
if material.arm_two_sided or wrd.arm_culling == False:
o['override_context'] = {}
o['override_context']['cull_mode'] = 'none'

View file

@ -1,14 +1,40 @@
def write(vert):
vert.add_uniform('mat4 pd', '_particleData')
vert.write('spos.xyz += offp.xyz;')
str_tex_hash = "float fhash(float n) { return fract(sin(n) * 43758.5453); }"
vert.add_function(str_tex_hash)
# var ptime = (count - p.i) * spawnRate;
vert.write('float ptime = (pd[0][0] - offp.w) * pd[0][1];')
# ptime -= ptime * fhash(i) * r.lifetime_random;
vert.write('ptime -= ptime * fhash(offp.w) * pd[2][3];')
# lifetime
vert.write('if (offp.w > pd[0][0] || ptime < 0 || ptime > pd[0][2]) { spos.x = spos.y = spos.z = -99999; }')
vert.write('ptime *= ptime;')
vert.write('ptime /= 5;')
vert.write('ptime /= 2;')
# volume/face pos
vert.write('spos.xyz += offp.xyz;')
# object_align_factor / 2 + gxyz
vert.write('vec3 ppos = vec3(pd[1][0], pd[1][1], pd[1][2]);')
# factor_random = pd[1][3]
# p.i = offp.w
# particles.length = pd[0][3]
vert.write('ppos.x += fhash(offp.w) * pd[1][3] - pd[1][3] / 2;')
vert.write('ppos.y += fhash(offp.w + pd[0][3]) * pd[1][3] - pd[1][3] / 2;')
vert.write('ppos.z += fhash(offp.w + 2 * pd[0][3]) * pd[1][3] - pd[1][3] / 2;')
# gxyz
vert.write('spos.x += pd[1][0] * ptime;')
vert.write('spos.y += pd[1][1] * ptime;')
vert.write('spos.z += pd[1][2] * ptime;')
vert.write('ppos.x += (pd[2][0] * ptime) / 5;')
vert.write('ppos.y += (pd[2][1] * ptime) / 5;')
vert.write('ppos.z += (pd[2][2] * ptime) / 5;')
vert.write('ppos.x *= ptime;')
vert.write('ppos.y *= ptime;')
vert.write('ppos.z *= ptime;')
vert.write('spos.xyz += ppos;')

View file

@ -317,6 +317,7 @@ def init_properties():
bpy.types.Material.export_vcols = bpy.props.BoolProperty(name="Export VCols", default=False)
bpy.types.Material.export_tangents = bpy.props.BoolProperty(name="Export Tangents", default=False)
bpy.types.Material.vertex_structure = bpy.props.StringProperty(name="Vertex Structure", default='')
bpy.types.Material.arm_skip_context = bpy.props.StringProperty(name="Skip Context", default='')
bpy.types.NodeSocket.is_uniform = bpy.props.BoolProperty(name="Is Uniform", description="Mark node sockets to be processed as material uniforms", default=False)
bpy.types.NodeTree.is_cached = bpy.props.BoolProperty(name="Node Tree Cached", description="No need to reexport node tree", default=False)
bpy.types.Material.signature = bpy.props.StringProperty(name="Signature", description="Unique string generated from material nodes", default="")

View file

@ -252,6 +252,7 @@ class MaterialPropsPanel(bpy.types.Panel):
columnb.prop(mat, 'arm_tess_shadows_outer')
layout.prop(mat, 'arm_custom_material')
layout.prop(mat, 'arm_skip_context')
layout.prop(mat, 'arm_billboard')
row = layout.row()
row.prop(mat, 'arm_tilesheet_mat')