Files
play-clj/src/play_clj/g3d.clj
2014-03-31 19:57:19 -04:00

163 lines
4.9 KiB
Clojure

(ns play-clj.g3d
(:require [play-clj.utils :as u])
(:import [com.badlogic.gdx.graphics.g3d Environment Material Model ModelBatch
ModelInstance]
[com.badlogic.gdx.graphics.g3d.attributes BlendingAttribute
ColorAttribute CubemapAttribute DepthTestAttribute FloatAttribute
IntAttribute TextureAttribute]
[com.badlogic.gdx.graphics.g3d.model.data ModelData]
[com.badlogic.gdx.graphics.g3d.utils AnimationController
ModelBuilder]
[play_clj.entities ModelEntity]))
; animation-controller
(defn animation-controller*
[entity]
(AnimationController. (u/get-obj entity :object)))
(defmacro animation-controller
"Returns an [AnimationController](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/utils/AnimationController.html).
(animation-controller model-entity)"
[entity & options]
`(let [^AnimationController object# (animation-controller* ~entity)]
(u/calls! object# ~@options)))
(defmacro animation-controller!
"Calls a single method on an `animation-controller`."
[object k & options]
`(let [^AnimationController object# ~object]
(u/call! object# ~k ~@options)))
; environment
(defn environment*
[]
(Environment.))
(defmacro environment
"Returns an [Environment](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/Environment.html).
(environment)"
[& options]
`(let [^Environment object# (environment*)]
(u/calls! object# ~@options)))
(defmacro environment!
"Calls a single method on an `environment`."
[screen k & options]
`(let [^Environment object# (u/get-obj ~screen :attributes)]
(u/call! object# ~k ~@options)))
; model-batch
(defn model-batch*
[]
(ModelBatch.))
(defmacro model-batch
"Returns a [ModelBatch](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/ModelBatch.html).
(model-batch)"
[& options]
`(let [^ModelBatch object# (model-batch*)]
(u/calls! object# ~@options)))
(defmacro model-batch!
"Calls a single method on a `model-batch`."
[screen k & options]
`(let [^ModelBatch object# (u/get-obj ~screen :renderer)]
(u/call! object# ~k ~@options)))
; model
(defmacro model
"Returns an entity based on [ModelInstance](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/ModelInstance.html)."
[& args]
`(ModelEntity.
(let [arg1# ~(first args)]
(cond
(:object arg1#)
(ModelInstance. ^ModelInstance (:object arg1#))
(isa? arg1# ModelData)
(ModelInstance. ^Model (Model. ~@args))
:else
(ModelInstance. ~@args)))))
(defmacro model!
"Calls a single method on a `model`."
[entity k & options]
`(let [^ModelInstance object# (u/get-obj ~entity :object)]
(u/call! object# ~k ~@options)))
; model-builder
(defn model-builder*
[]
(ModelBuilder.))
(defmacro model-builder
"Returns a [ModelBuilder](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/utils/ModelBuilder.html).
(model-builder)"
[& options]
`(let [^ModelBuilder object# (model-builder*)]
(u/calls! object# ~@options)))
(defmacro model-builder!
"Calls a single method on a `model-builder`."
[object k & options]
`(u/call! ^ModelBuilder ~object ~k ~@options))
; material
(defn material*
[]
(Material.))
(defmacro material
"Returns a [Material](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/Material.html).
(material)"
[& options]
`(let [^Material object# (material*)]
(u/calls! object# ~@options)))
(defmacro material!
"Calls a single method on a `material`."
[object k & options]
`(u/call! ^Material ~object ~k ~@options))
; attribute
(defn ^:private attribute-init
[k]
(u/gdx :graphics :g3d :attributes (str (u/key->pascal k) "Attribute.")))
(defmacro attribute
"Returns a subclass of [Attribute](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/Attribute.html).
(attribute :color (attribute-type :color :diffuse) (color :blue))"
[type & args]
`(~(attribute-init type) ~@args))
(defmacro attribute-type
"Returns a static field in a subclass of [Attribute](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/Attribute.html).
(attribute-type :color :diffuse)"
[type k]
`~(u/gdx-field :graphics :g3d :attributes
(str (u/key->pascal type) "Attribute")
(u/key->pascal k)))
(defmacro attribute!
"Calls a static method in a subclass of [Attribute](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/Attribute.html).
(attribute! :color :create-diffuse (color :blue))"
[type k & options]
`(~(u/gdx-field :graphics :g3d :attributes
(str (u/key->pascal type) "Attribute")
(u/key->camel k))
~@options))