mirror of
https://github.com/open-goal/jak-project
synced 2026-06-09 12:46:43 -04:00
attempting to slightly optimize defpart (#2587)
This commit is contained in:
@@ -359,7 +359,10 @@
|
||||
(defmacro defpart (id &key (init-specs ()))
|
||||
"define a new sparticle-launcher"
|
||||
|
||||
(let ((last-field-id -1))
|
||||
(let ((last-field-id -1)
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
|
||||
`(set! (-> *part-id-table* ,id)
|
||||
(new 'static 'sparticle-launcher
|
||||
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
|
||||
@@ -377,27 +380,27 @@
|
||||
(let* ((field-id (cadr field))
|
||||
(field-enum-name (caddr field))
|
||||
(vel? (and #f (cadddr field)))
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
|
||||
(param-count (length params)))
|
||||
(param-count (length params))
|
||||
(param0 (and (>= param-count 1) (first params)))
|
||||
(param1 (and (>= param-count 2) (second params)))
|
||||
(param2 (and (>= param-count 3) (third params))))
|
||||
(when (>= last-field-id field-id)
|
||||
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
|
||||
(set! last-field-id field-id)
|
||||
(cond
|
||||
((eq? field-name "flags")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
|
||||
)
|
||||
((eq? field-name "texture")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
|
||||
)
|
||||
((eq? field-name "next-launcher")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
|
||||
)
|
||||
((eq? field-name "sound")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
|
||||
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
|
||||
(other-field-id (cadr other-field)))
|
||||
(when (>= other-field-id field-id)
|
||||
@@ -406,55 +409,55 @@
|
||||
:initial-value ,(- other-field-id field-id) :random-mult 1)
|
||||
)
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
|
||||
:pntr (the-as pointer ,(cadr (member (string->symbol ":data") params))))
|
||||
)
|
||||
((and (= 1 param-count) (param-symbol? (first params)))
|
||||
((and (= 1 param-count) (param-symbol? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
|
||||
:sym ,(first params))
|
||||
:sym ,param0)
|
||||
)
|
||||
((and (= 1 param-count) (param-float? (first params)))
|
||||
((and (= 1 param-count) (param-float? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef 0.0
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
|
||||
((and (= 2 param-count) (param-float? param0) (param-float? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-range ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-range ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 1 param-count) (param-int? (first params)))
|
||||
((and (= 1 param-count) (param-int? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:initial-value ,param0
|
||||
:random-range 0
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
|
||||
((and (= 2 param-count) (param-int? param0) (param-int? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
|
||||
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:random-mult ,(third params))
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult ,param2)
|
||||
)
|
||||
(#t
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))
|
||||
|
||||
@@ -225,7 +225,10 @@
|
||||
(defmacro defpart (id &key (init-specs ()))
|
||||
"define a new sparticle-launcher"
|
||||
|
||||
(let ((last-field-id -1))
|
||||
(let ((last-field-id -1)
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
|
||||
`(set! (-> *part-id-table* ,id)
|
||||
(new 'static 'sparticle-launcher
|
||||
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
|
||||
@@ -243,28 +246,28 @@
|
||||
(let* ((field-id (cadr field))
|
||||
(field-enum-name (caddr field))
|
||||
(vel? (and #f (cadddr field)))
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
|
||||
(store? (member (string->symbol ":store") params))
|
||||
(param-count (if store? (1- (length params)) (length params))))
|
||||
(param-count (if store? (1- (length params)) (length params)))
|
||||
(param0 (and (>= param-count 1) (first params)))
|
||||
(param1 (and (>= param-count 2) (second params)))
|
||||
(param2 (and (>= param-count 3) (third params))))
|
||||
(when (>= last-field-id field-id)
|
||||
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
|
||||
(set! last-field-id field-id)
|
||||
(cond
|
||||
((eq? field-name "flags")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
|
||||
)
|
||||
((eq? field-name "texture")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
|
||||
)
|
||||
((eq? field-name "next-launcher")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
|
||||
)
|
||||
((eq? field-name "sound")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
|
||||
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
|
||||
(other-field-id (cadr other-field)))
|
||||
(when (>= other-field-id field-id)
|
||||
@@ -273,55 +276,55 @@
|
||||
:initial-value ,(- other-field-id field-id) :random-mult 1)
|
||||
)
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
|
||||
:object ,(cadr (member (string->symbol ":data") params)))
|
||||
)
|
||||
((and (= 1 param-count) (param-symbol? (first params)))
|
||||
((and (= 1 param-count) (param-symbol? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
|
||||
:sym ,(first params))
|
||||
:sym ,param0)
|
||||
)
|
||||
((and (= 1 param-count) (param-float? (first params)))
|
||||
((and (= 1 param-count) (param-float? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef 0.0
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
|
||||
((and (= 2 param-count) (param-float? param0) (param-float? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-range ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-range ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 1 param-count) (param-int? (first params)))
|
||||
((and (= 1 param-count) (param-int? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:initial-value ,param0
|
||||
:random-range 0
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
|
||||
((and (= 2 param-count) (param-int? param0) (param-int? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
|
||||
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:random-mult ,(third params))
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult ,param2)
|
||||
)
|
||||
(#t
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))
|
||||
|
||||
+38
-35
@@ -730,7 +730,10 @@
|
||||
(defmacro defpart (id &key (init-specs ()))
|
||||
"define a new sparticle-launcher"
|
||||
|
||||
(let ((last-field-id -1))
|
||||
(let ((last-field-id -1)
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
|
||||
`(set! (-> *part-id-table* ,id)
|
||||
(new 'static 'sparticle-launcher
|
||||
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
|
||||
@@ -748,27 +751,27 @@
|
||||
(let* ((field-id (cadr field))
|
||||
(field-enum-name (caddr field))
|
||||
(vel? (and #f (cadddr field)))
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
|
||||
(param-count (length params)))
|
||||
(param-count (length params))
|
||||
(param0 (and (>= param-count 1) (first params)))
|
||||
(param1 (and (>= param-count 2) (second params)))
|
||||
(param2 (and (>= param-count 3) (third params))))
|
||||
(when (>= last-field-id field-id)
|
||||
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
|
||||
(set! last-field-id field-id)
|
||||
(cond
|
||||
((eq? field-name "flags")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
|
||||
)
|
||||
((eq? field-name "texture")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
|
||||
)
|
||||
((eq? field-name "next-launcher")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
|
||||
)
|
||||
((eq? field-name "sound")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
|
||||
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
|
||||
(other-field-id (cadr other-field)))
|
||||
(when (>= other-field-id field-id)
|
||||
@@ -777,55 +780,55 @@
|
||||
:initial-value ,(- other-field-id field-id) :random-mult 1)
|
||||
)
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
|
||||
:pntr (the-as pointer ,(cadr (member (string->symbol ":data") params))))
|
||||
)
|
||||
((and (= 1 param-count) (param-symbol? (first params)))
|
||||
((and (= 1 param-count) (param-symbol? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
|
||||
:sym ,(first params))
|
||||
:sym ,param0)
|
||||
)
|
||||
((and (= 1 param-count) (param-float? (first params)))
|
||||
((and (= 1 param-count) (param-float? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef 0.0
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
|
||||
((and (= 2 param-count) (param-float? param0) (param-float? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-range ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-range ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 1 param-count) (param-int? (first params)))
|
||||
((and (= 1 param-count) (param-int? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:initial-value ,param0
|
||||
:random-range 0
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
|
||||
((and (= 2 param-count) (param-int? param0) (param-int? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
|
||||
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:random-mult ,(third params))
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult ,param2)
|
||||
)
|
||||
(#t
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))
|
||||
|
||||
+38
-35
@@ -1074,7 +1074,10 @@
|
||||
(defmacro defpart (id &key (init-specs ()))
|
||||
"define a new sparticle-launcher"
|
||||
|
||||
(let ((last-field-id -1))
|
||||
(let ((last-field-id -1)
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
|
||||
`(set! (-> *part-id-table* ,id)
|
||||
(new 'static 'sparticle-launcher
|
||||
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
|
||||
@@ -1092,28 +1095,28 @@
|
||||
(let* ((field-id (cadr field))
|
||||
(field-enum-name (caddr field))
|
||||
(vel? (and #f (cadddr field)))
|
||||
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
|
||||
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
|
||||
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
|
||||
(store? (member (string->symbol ":store") params))
|
||||
(param-count (if store? (1- (length params)) (length params))))
|
||||
(param-count (if store? (1- (length params)) (length params)))
|
||||
(param0 (and (>= param-count 1) (first params)))
|
||||
(param1 (and (>= param-count 2) (second params)))
|
||||
(param2 (and (>= param-count 3) (third params))))
|
||||
(when (>= last-field-id field-id)
|
||||
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
|
||||
(set! last-field-id field-id)
|
||||
(cond
|
||||
((eq? field-name "flags")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
|
||||
)
|
||||
((eq? field-name "texture")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
|
||||
)
|
||||
((eq? field-name "next-launcher")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
|
||||
)
|
||||
((eq? field-name "sound")
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
|
||||
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
|
||||
(other-field-id (cadr other-field)))
|
||||
(when (>= other-field-id field-id)
|
||||
@@ -1122,55 +1125,55 @@
|
||||
:initial-value ,(- other-field-id field-id) :random-mult 1)
|
||||
)
|
||||
)
|
||||
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
|
||||
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
|
||||
:object ,(cadr (member (string->symbol ":data") params)))
|
||||
)
|
||||
((and (= 1 param-count) (param-symbol? (first params)))
|
||||
((and (= 1 param-count) (param-symbol? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
|
||||
:sym ,(first params))
|
||||
:sym ,param0)
|
||||
)
|
||||
((and (= 1 param-count) (param-float? (first params)))
|
||||
((and (= 1 param-count) (param-float? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef 0.0
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
|
||||
((and (= 2 param-count) (param-float? param0) (param-float? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
|
||||
:random-multf 1.0)
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-rangef ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-rangef ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
|
||||
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
|
||||
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
|
||||
:random-range ,(second params)
|
||||
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
|
||||
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
|
||||
:random-range ,param1
|
||||
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
|
||||
)
|
||||
((and (= 1 param-count) (param-int? (first params)))
|
||||
((and (= 1 param-count) (param-int? param0))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:initial-value ,param0
|
||||
:random-range 0
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
|
||||
((and (= 2 param-count) (param-int? param0) (param-int? param1))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult 1)
|
||||
)
|
||||
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
|
||||
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
|
||||
:initial-value ,(first params)
|
||||
:random-range ,(second params)
|
||||
:random-mult ,(third params))
|
||||
:initial-value ,param0
|
||||
:random-range ,param1
|
||||
:random-mult ,param2)
|
||||
)
|
||||
(#t
|
||||
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))
|
||||
|
||||
Reference in New Issue
Block a user