More GPU particles
This commit is contained in:
parent
ece7eb40c6
commit
9307f57779
|
@ -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) {
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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;')
|
||||
|
|
|
@ -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="")
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in a new issue