use of com.badlogic.gdx.graphics.g3d.model.Node in project libgdx by libgdx.
the class ModelBuilder method node.
/** Add a node to the model. Use any of the part(...) method to add a NodePart.
* @return The node being created. */
public Node node() {
final Node node = new Node();
node(node);
node.id = "node" + model.nodes.size;
return node;
}
use of com.badlogic.gdx.graphics.g3d.model.Node in project libgdx by libgdx.
the class SkeletonTest method renderSkeleton.
public void renderSkeleton(final Vector3 from, final Node node) {
final Vector3 pos = vectorPool.obtain();
node.globalTransform.getTranslation(pos);
shapeRenderer.setColor(node.isAnimated ? Color.RED : Color.YELLOW);
shapeRenderer.box(pos.x, pos.y, pos.z, 0.5f, 0.5f, 0.5f);
shapeRenderer.setColor(Color.WHITE);
shapeRenderer.line(from.x, from.y, from.z, pos.x, pos.y, pos.z);
for (Node child : node.getChildren()) renderSkeleton(pos, child);
vectorPool.free(pos);
}
use of com.badlogic.gdx.graphics.g3d.model.Node in project gdx-skineditor by cobolfoo.
the class PreviewPane method refresh.
/**
*
*/
public void refresh() {
Gdx.app.log("PreviewPane", "Refresh pane!");
clear();
ImageButton button = (ImageButton) game.screenMain.barWidgets.group.getChecked();
String widget = button.getUserObject().toString();
String widgetStyle = "com.badlogic.gdx.scenes.scene2d.ui." + widget + "$" + widget + "Style";
try {
Class<?> style = Class.forName(widgetStyle);
ObjectMap<String, ?> styles = game.skinProject.getAll(style);
if (styles == null) {
Label label = new Label("No styles defined for this widget type", game.skin, "error");
add(label).row().pad(10);
} else {
Keys<String> keys = styles.keys();
Array<String> sortedKeys = new Array<String>();
for (String key : keys) {
sortedKeys.add(key);
}
sortedKeys.sort();
for (String key : sortedKeys) {
// We render one per key
add(new Label(key, game.skin, "title")).left().pad(10).expandX().row();
try {
if (widget.equals("Label")) {
Label w = new Label("This is a Label widget", game.skinProject, key);
add(w).pad(10).padBottom(20).row();
} else if (widget.equals("Button")) {
// Button
Button w = new Button(game.skinProject, key);
add(w).width(120).height(32).pad(10).padBottom(20).row();
} else if (widget.equals("TextButton")) {
// TextButton
TextButton w = new TextButton("This is a TextButton widget", game.skinProject, key);
add(w).pad(10).padBottom(20).row();
} else if (widget.equals("ImageButton")) {
// ImageButton
ImageButton w = new ImageButton(game.skinProject, key);
add(w).pad(10).padBottom(20).row();
} else if (widget.equals("CheckBox")) {
// CheckBox
CheckBox w = new CheckBox("This is a CheckBox widget", game.skinProject, key);
w.setChecked(true);
add(w).pad(10).padBottom(20).row();
} else if (widget.equals("TextField")) {
// TextField
TextField w = new TextField("This is a TextField widget", game.skinProject, key);
if (w.getStyle().fontColor == null) {
throw new Exception("Textfield style requires a font color!");
}
w.addListener(stopTouchDown);
add(w).pad(10).width(220).padBottom(20).row();
} else if (widget.equals("List")) {
// List
List w = new List(game.skinProject, key);
Array<String> items = new Array<String>();
items.add("This is");
items.add("a");
items.add("List widget!");
w.setItems(items);
add(w).pad(10).width(220).height(120).padBottom(20).expandX().fillX().row();
} else if (widget.equals("SelectBox")) {
// SelectBox
SelectBox<String> w = new SelectBox<String>(game.skinProject, key);
Array<String> items = new Array<String>();
items.add("This is");
items.add("a");
items.add("SelectBox widget!");
w.setItems(items);
add(w).pad(10).width(220).padBottom(20).expandX().fillX().row();
} else if (widget.equals("ProgressBar")) {
// ProgressBar
ProgressBarStyle progressStyle = game.skinProject.get(key, ProgressBarStyle.class);
// Check for edge-case: fields knob and knobBefore are optional but at least one should be specified
if (progressStyle.knob == null && progressStyle.knobBefore == null) {
throw new IllegalArgumentException("Fields 'knob' and 'knobBefore' in ProgressBarStyle are both optional but at least one should be specified");
}
ProgressBar w = new ProgressBar(0, 100, 5, false, progressStyle);
w.setValue(50);
w.addListener(stopTouchDown);
add(w).pad(10).width(220).padBottom(20).expandX().fillX().row();
} else if (widget.equals("Slider")) {
// Slider
Slider w = new Slider(0, 100, 5, false, game.skinProject, key);
add(w).pad(10).width(220).padBottom(20).expandX().fillX().row();
w.addListener(stopTouchDown);
Slider w2 = new Slider(0, 100, 5, true, game.skinProject, key);
add(w2).pad(10).padBottom(20).expandX().fillX().row();
w2.addListener(stopTouchDown);
} else if (widget.equals("ScrollPane")) {
// ScrollPane
Table t = new Table(game.skin);
for (int i = 0; i < 20; i++) {
t.add("This is a ScrollPane Widget").padRight(10);
t.add("This is a ScrollPane Widget").padRight(10);
t.add("This is a ScrollPane Widget").row();
}
ScrollPane w = new ScrollPane(t, game.skinProject, key);
w.addListener(stopTouchDown);
w.setFlickScroll(true);
w.setScrollbarsOnTop(true);
w.setScrollBarPositions(true, true);
w.setFadeScrollBars(false);
add(w).pad(10).width(420).height(240).padBottom(20).expandX().fillX().row();
} else if (widget.equals("SplitPane")) {
for (int j = 0; j < 2; j++) {
Table t = new Table(game.skin);
t.setBackground(game.skin.getDrawable("default-rect"));
Table t2 = new Table(game.skin);
t2.setBackground(game.skin.getDrawable("default-rect"));
for (int i = 0; i < 20; i++) {
t.add("This is a SplitPane Widget").pad(10).row();
t2.add("This is a SplitPane Widget").pad(10).row();
}
SplitPane w = new SplitPane(t, t2, (j % 2 == 0), game.skinProject, key);
w.addListener(stopTouchDown);
add(w).pad(10).width(220).height(160).padBottom(20).expandX().fillX();
}
row();
} else if (widget.equals("Window")) {
// Window
Table t = new Table(game.skin);
for (int i = 0; i < 5; i++) {
t.add("This is a Window Widget").row();
}
Window w = new Window("This is a Window Widget", game.skinProject, key);
w.addListener(stopTouchDown);
w.add(t);
add(w).pad(10).width(420).height(240).padBottom(20).expandX().fillX().row();
} else if (widget.equals("Touchpad")) {
// Touchpad
Touchpad w = new Touchpad(0, game.skinProject, key);
w.addListener(stopTouchDown);
add(w).pad(10).width(200).height(200).padBottom(20).expandX().fillX().row();
} else if (widget.equals("Tree")) {
// Tree
Tree w = new Tree(game.skinProject, key);
Tree.Node node = new Tree.Node(new Label("This", game.skin));
Tree.Node node1 = new Tree.Node(new Label("is", game.skin));
Tree.Node node2 = new Tree.Node(new Label("a", game.skin));
Tree.Node node3 = new Tree.Node(new Label("Tree", game.skin));
Tree.Node node4 = new Tree.Node(new Label("Widget", game.skin));
node3.add(node4);
node2.add(node3);
node1.add(node2);
node.add(node1);
w.add(node);
w.expandAll();
add(w).pad(10).width(200).height(200).padBottom(20).expandX().fillX().row();
} else {
add(new Label("Unknown widget type!", game.skin, "error")).pad(10).padBottom(20).row();
}
} catch (Exception e) {
add(new Label("Please fill all required fields", game.skin, "error")).pad(10).padBottom(20).row();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
use of com.badlogic.gdx.graphics.g3d.model.Node in project bdx by GoranM.
the class GameObject method join.
public void join(HashMap<Mesh, ArrayList<Matrix4f>> map) {
// Collect transformed vertex arrays for each material & calculate number of indices
int VERT_STRIDE = Bdx.VERT_STRIDE;
HashMap<Material, ArrayList<float[]>> tvaMap = new HashMap<Material, ArrayList<float[]>>();
HashMap<Material, Integer> lenMap = new HashMap<Material, Integer>();
Mesh m;
Node node;
Material mat;
MeshPart meshPart;
float[] va, tva;
int numIndices, numVertices, offset, j, len;
Vector3f p = new Vector3f();
Vector3f s = new Vector3f();
Matrix3f o = new Matrix3f();
Vector3f vP = new Vector3f();
Vector3f nP = new Vector3f();
Vector3f vPT = new Vector3f();
Vector3f nPT = new Vector3f();
Vector3f pos = position();
Vector3f sca = scale();
Matrix3f oriInv = orientation().inverted();
for (Map.Entry<Mesh, ArrayList<Matrix4f>> e : map.entrySet()) {
m = e.getKey();
node = m.model.nodes.get(0);
for (Matrix4f t : e.getValue()) {
t.get(p);
p.sub(pos);
p = oriInv.mult(p.div(sca));
t.getRotationScale(o);
o = oriInv.mult(o);
s.set(t.m30, t.m31, t.m32);
if (s.length() == 0) {
s.set(1, 1, 1);
}
s = s.div(sca);
for (NodePart nodePart : node.parts) {
meshPart = nodePart.meshPart;
numIndices = meshPart.size;
numVertices = numIndices * VERT_STRIDE;
offset = meshPart.offset * VERT_STRIDE;
va = meshPart.mesh.getVertices(offset, numVertices, new float[numVertices]);
tva = new float[numVertices];
j = 0;
for (int i = 0; i < numIndices; i++) {
vP.set(va[j], va[j + 1], va[j + 2]);
nP.set(va[j + 3], va[j + 4], va[j + 5]);
vPT.set(o.mult(vP.mul(s)));
vPT.add(p);
nPT.set(o.mult(vP.plus(nP)));
nPT.sub(o.mult(vP));
tva[j] = vPT.x;
tva[j + 1] = vPT.y;
tva[j + 2] = vPT.z;
tva[j + 3] = nPT.x;
tva[j + 4] = nPT.y;
tva[j + 5] = nPT.z;
tva[j + 6] = va[j + 6];
tva[j + 7] = va[j + 7];
j += VERT_STRIDE;
}
mat = m.materials.get(nodePart.material.id);
ArrayList<float[]> l;
if (tvaMap.containsKey(mat)) {
l = tvaMap.get(mat);
len = lenMap.get(mat);
} else {
l = new ArrayList<float[]>();
tvaMap.put(mat, l);
len = 0;
}
l.add(tva);
lenMap.put(mat, len + tva.length);
}
}
}
// Build a unique model out of meshparts for each material
ModelBuilder builder = new ModelBuilder();
builder.begin();
short idx = 0;
MeshPartBuilder mpb;
for (Map.Entry<Material, ArrayList<float[]>> e : tvaMap.entrySet()) {
mat = e.getKey();
len = lenMap.get(mat);
tva = new float[len];
j = 0;
for (float[] verts : e.getValue()) {
numVertices = verts.length;
for (int i = 0; i < numVertices; i++) {
tva[i + j] = verts[i];
}
j += numVertices;
}
mpb = builder.part(mat.name(), GL20.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, mat);
mpb.vertex(tva);
try {
for (short i = 0; i < len / VERT_STRIDE; i++) {
mpb.index(idx);
idx += 1;
}
} catch (Error error) {
throw new RuntimeException("MODEL ERROR: Models with more than 32767 vertices are not supported. Decrease the number of objects to join.");
}
}
Model finishedModel = builder.end();
// Update mesh
mesh(new Mesh(finishedModel, scene));
// Update dimensionsNoScale and origin
com.badlogic.gdx.graphics.Mesh mesh = finishedModel.meshes.first();
BoundingBox bbox = mesh.calculateBoundingBox();
Vector3 dimensions = bbox.getDimensions(new Vector3());
Vector3 center = bbox.getCenter(new Vector3());
dimensionsNoScale = new Vector3f(dimensions.x, dimensions.y, dimensions.z);
origin = new Vector3f(center.x, center.y, center.z);
// Update body
updateBody();
if (json.get("mesh_name").asString() == null) {
visible = json.get("visible").asBoolean();
}
}
use of com.badlogic.gdx.graphics.g3d.model.Node in project libgdx by libgdx.
the class Basic3DSceneTest method doneLoading.
private void doneLoading() {
Model model = assets.get("data/g3d/invaders.g3dj", Model.class);
for (int i = 0; i < model.nodes.size; i++) {
String id = model.nodes.get(i).id;
ModelInstance instance = new ModelInstance(model, id);
Node node = instance.getNode(id);
instance.transform.set(node.globalTransform);
node.translation.set(0, 0, 0);
node.scale.set(1, 1, 1);
node.rotation.idt();
instance.calculateTransforms();
if (id.equals("space")) {
space = instance;
continue;
}
instances.add(instance);
if (id.equals("ship"))
ship = instance;
else if (id.startsWith("block"))
blocks.add(instance);
else if (id.startsWith("invader"))
invaders.add(instance);
}
loading = false;
}
Aggregations