This commit is contained in:
Ronja 2022-01-24 17:48:06 +01:00
parent 0a3a2c4477
commit 1979caf360
7 changed files with 124 additions and 45 deletions

View file

@ -3,6 +3,6 @@ material = {
inputs = {
sprite.image = "asset/flag"
sprite.color = [1 1 1 1]
sprite.uv = [1 0 0 1]
sprite.uv = [0 0 1 1]
}
}

View file

@ -45,8 +45,8 @@ class Game is Ready {
Trail.reset(_blade)
}
// app.color.r = app.color.g = app.color.b = (IO.timestamp()/20 % 1)
System.print(1/delta)
//app.color.r = app.color.g = app.color.b = (IO.timestamp()/20 % 1)
//System.print(1/delta)
} //tick
destroy() {

View file

@ -4,13 +4,15 @@ modifier = {
field = "trail"
display = "Trail" //the display in the editor
class = "Trail" //The code generated name for the modifier API
block = { //The data for the modifier
block = { //The data for the modifiers
fields = [
{ name="edge_length" type="number" default=100 }
{ name="time_based" type="boolean" default=false }
{ name="length" type="number" default=500 }
{ name="subdivisions_length" type="number" default=1000 }
{ name="subdivisions_width" type="number" default=10 }
{ name="time_based" type="boolean" default=true }
{ name="normalize_uvs" type="boolean" default=true }
//{ name="interpolate_curves" type="boolean" default=true } //todo
{ name="length" type="number" default=1 }
{ name="subdivisions_length" type="number" default=30 }
{ name="subdivisions_width" type="number" default=5 }
{ name="material" type="id32" editor="material" default="asset/flag"}
]
}

View file

@ -157,10 +157,11 @@ import "luxe: world" for Block
construct new() {
_edge_length = 100
_time_based = false
_length = 500
_subdivisions_length = 1000
_subdivisions_width = 10
_time_based = true
_normalize_uvs = true
_length = 1
_subdivisions_length = 30
_subdivisions_width = 5
_material = "asset/flag"
} //new
@ -170,6 +171,9 @@ import "luxe: world" for Block
time_based { _time_based }
time_based=(vvv) { _time_based = vvv }
normalize_uvs { _normalize_uvs }
normalize_uvs=(vvv) { _normalize_uvs = vvv }
length { _length }
length=(vvv) { _length = vvv }
@ -199,6 +203,8 @@ import "luxe: world" for Block
size = size + 4 // time_based
size = size + 4 // normalize_uvs
size = size + 8 // length
size = size + 8 // subdivisions_length
@ -221,6 +227,7 @@ import "luxe: world" for Block
"luxe.self.modifier": false, //:luxe:internal
"edge_length": false,
"time_based": false,
"normalize_uvs": false,
"length": false,
"subdivisions_length": false,
"subdivisions_width": false,
@ -254,22 +261,27 @@ import "luxe: world" for Block
var time_based = instance["time_based"]
if(time_based == null) time_based = false
if(time_based == null) time_based = true
out.write_int32(time_based ? 1 : 0)
var normalize_uvs = instance["normalize_uvs"]
if(normalize_uvs == null) normalize_uvs = true
out.write_int32(normalize_uvs ? 1 : 0)
var length = instance["length"]
if(length == null) length = 500
if(length == null) length = 1
out.write_float64(length)
var subdivisions_length = instance["subdivisions_length"]
if(subdivisions_length == null) subdivisions_length = 1000
if(subdivisions_length == null) subdivisions_length = 30
out.write_float64(subdivisions_length)
var subdivisions_width = instance["subdivisions_width"]
if(subdivisions_width == null) subdivisions_width = 10
if(subdivisions_width == null) subdivisions_width = 5
out.write_float64(subdivisions_width)
@ -284,7 +296,7 @@ import "luxe: world" for Block
bytes_count_block() {
return 96
return 108
} //bytes_count_block
@ -294,7 +306,7 @@ import "luxe: world" for Block
out.write_uint32(compiler.string.hash("modifiers/trail/trail > data"))
//fields count
out.write_int32(6)
out.write_int32(7)
// edge_length
out.write_uint32(compiler.string.hash("edge_length"))
@ -306,28 +318,35 @@ import "luxe: world" for Block
// time_based
out.write_uint32(compiler.string.hash("time_based"))
out.write_uint32(1710517951) //type boolean
var time_based_default = false
var time_based_default = true
out.write_int32(time_based_default ? 1 : 0)
// normalize_uvs
out.write_uint32(compiler.string.hash("normalize_uvs"))
out.write_uint32(1710517951) //type boolean
var normalize_uvs_default = true
out.write_int32(normalize_uvs_default ? 1 : 0)
// length
out.write_uint32(compiler.string.hash("length"))
out.write_uint32(467038368) //type number
var length_default = 500
var length_default = 1
out.write_float64(length_default)
// subdivisions_length
out.write_uint32(compiler.string.hash("subdivisions_length"))
out.write_uint32(467038368) //type number
var subdivisions_length_default = 1000
var subdivisions_length_default = 30
out.write_float64(subdivisions_length_default)
// subdivisions_width
out.write_uint32(compiler.string.hash("subdivisions_width"))
out.write_uint32(467038368) //type number
var subdivisions_width_default = 10
var subdivisions_width_default = 5
out.write_float64(subdivisions_width_default)
@ -373,10 +392,11 @@ import "luxe: world" for Block
_inst_type = instance_type
_inst = _inst_type.new(_block, 0)
Block.add(_block, "edge_length", "number", 100)
Block.add(_block, "time_based", "boolean", false)
Block.add(_block, "length", "number", 500)
Block.add(_block, "subdivisions_length", "number", 1000)
Block.add(_block, "subdivisions_width", "number", 10)
Block.add(_block, "time_based", "boolean", true)
Block.add(_block, "normalize_uvs", "boolean", true)
Block.add(_block, "length", "number", 1)
Block.add(_block, "subdivisions_length", "number", 30)
Block.add(_block, "subdivisions_width", "number", 5)
Block.add(_block, "material", "id32", "asset/flag")
Block.set_type(_block, "modifiers/trail/trail > data")
} //new
@ -388,6 +408,8 @@ import "luxe: world" for Block
edge_length=(v) { Block.set(_block, "edge_length", _slot, v) }
time_based { Block.get(_block, "time_based", _slot) }
time_based=(v) { Block.set(_block, "time_based", _slot, v) }
normalize_uvs { Block.get(_block, "normalize_uvs", _slot) }
normalize_uvs=(v) { Block.set(_block, "normalize_uvs", _slot, v) }
length { Block.get(_block, "length", _slot) }
length=(v) { Block.set(_block, "length", _slot, v) }
subdivisions_length { Block.get(_block, "subdivisions_length", _slot) }

View file

@ -200,13 +200,15 @@ class TrailSystem is ModifierSystem {
}
tick(delta) {
//System.print("positions")
record_positions(delta)
//System.print("buffers")
update_buffers()
//System.print("debug")
//debug_draw()
debug_draw()
//System.print("end")
} //tick
record_positions(delta: Num){
@ -216,7 +218,7 @@ class TrailSystem is ModifierSystem {
var instance_data: TrailData = _instance_data[entity]
var pos = Transform.get_pos_world(entity)
var up = Transform.local_dir_to_world(entity, 0, data.edge_length * 0.5, 0)
var up = Transform.local_dir_to_world(entity, 0, 1, 0)
var prev_pos = instance_data.previous_pos || pos
var prev_up = instance_data.previous_up || up
@ -250,6 +252,8 @@ class TrailSystem is ModifierSystem {
dist = dist + diff
var step = data.length / data.subdivisions_length
while(dist > step){
//interpolate between points
//todo: extrapolate curve instead of linear
dist = dist - step
var t = 1 - dist / diff
var point = Point.new([
@ -262,6 +266,7 @@ class TrailSystem is ModifierSystem {
Math.lerp(prev_up.z, up.z, t)
])
Math.normalize(point.up)
//System.print(point.up)
if(instance_data.points.count >= data.subdivisions_length - 1) instance_data.points.dequeue()
instance_data.points.enqueue(point)
}
@ -274,25 +279,15 @@ class TrailSystem is ModifierSystem {
update_buffers(){
each{|entity, data: ModifierData|
if(!Transform.has(entity)) return
var instance_data: TrailData = _instance_data[entity]
var positions = Floats.new(Render.vertex_buffer_get_size(instance_data.position_buffer) / 4)
Render.vertex_buffer_get_data(instance_data.position_buffer, positions, positions.size * 4, 0)
//System.print("positions(%(Render.vertex_buffer_get_size(instance_data.position_buffer))):")
//System.print((0...(positions.size/4)).map{|i|"[%(positions[i*4]), %(positions[i*4+1]), %(positions[i*4+2])]"}.join("\n"))
var i = -1
for(p in instance_data.points){
i = i + 1
for(ii in 0...data.subdivisions_width){
var t = ii / (data.subdivisions_width-1)
var offset_x = Math.lerp(-p.up.x, p.up.x, t)
var offset_y = Math.lerp(-p.up.y, p.up.y, t)
var offset_z = Math.lerp(-p.up.z, p.up.z, t)
positions[i*4*data.subdivisions_width + ii*4 + 0] = p.pos.x + offset_x * data.edge_length * 0.5
positions[i*4*data.subdivisions_width + ii*4 + 1] = p.pos.y + offset_y * data.edge_length * 0.5
positions[i*4*data.subdivisions_width + ii*4 + 2] = p.pos.z + offset_z * data.edge_length * 0.5
}
}
if(Transform.has(entity)){
{
i = i + 1
var start = Transform.local_point_to_world(entity, 0, data.edge_length * -0.5, 0)
@ -308,6 +303,62 @@ class TrailSystem is ModifierSystem {
positions[i*4*data.subdivisions_width + ii*4 + 2] = pos_z
}
}
var step = data.length / data.subdivisions_length
var point_index = -1
System.print("------------")
while(true){
point_index = point_index + 1
if(point_index >= instance_data.points.count) break
i = i + 1
var p:Point = instance_data.points[point_index]
var from: Vec
var from_up: Vec
if(point_index == 0){
from = Transform.get_pos_world(entity)
from_up = Transform.local_dir_to_world(entity, 0, 1, 0)
} else {
var prev: Point = instance_data.points[point_index-1]
from = prev.pos
from_up = prev.up
}
System.print(from_up)
var to = p.pos
var to_up = p.up
var t = instance_data.progress_since_last_point / step
var pos_x = Math.lerp(from.x, to.x, t)
var pos_y = Math.lerp(from.y, to.y, t)
var pos_z = Math.lerp(from.z, to.z, t)
var up_x = Math.lerp(from_up.x, to_up.x, t)
var up_y = Math.lerp(from_up.y, to_up.y, t)
var up_z = Math.lerp(from_up.z, to_up.z, t)
pos_x = to.x
pos_y = to.y
pos_z = to.z
up_x = to_up.x
up_y = to_up.y
up_z = to_up.z
var x = instance_data.points.count + 1 - i
for(y in 0...data.subdivisions_width){
var t = 1 - y / (data.subdivisions_width-1)
var offset_x = Math.lerp(-p.up.x, p.up.x, t)
var offset_y = Math.lerp(-p.up.y, p.up.y, t)
var offset_z = Math.lerp(-p.up.z, p.up.z, t)
positions[x*4*data.subdivisions_width + y*4 + 0] = pos_x + offset_x * data.edge_length * 0.5
positions[x*4*data.subdivisions_width + y*4 + 1] = pos_y + offset_y * data.edge_length * 0.5
positions[x*4*data.subdivisions_width + y*4 + 2] = pos_z + offset_z * data.edge_length * 0.5
}
}
Render.vertex_buffer_replace(instance_data.position_buffer, positions, positions.length)
Geometry.set_vert_count(instance_data.geometry, i.max(0) * 6 * (data.subdivisions_width-1))
}

View file

@ -18,7 +18,7 @@ class App {
scale { Render.drawable_ratio() }
construct new() {
_color = [1,1,1,1]
//create worlds

View file

@ -43,6 +43,12 @@ class Queue is Sequence{
empty(){_count == 0}
[index]{
index = _head - _count + 1 + index
if(index < 0) index = _data.count + index
return _data[index]
}
iterate(iter){
if(!iter) return _count > 0 ? 0 : false
if(iter >= _count - 1) return false
@ -50,8 +56,6 @@ class Queue is Sequence{
}
iteratorValue(iter){
var index = _head - _count + 1 + iter
if(index < 0) index = _data.count + index
return _data[index]
return this[iter]
}
}