Example usage for com.badlogic.gdx.graphics.g3d.utils MeshPartBuilder index

List of usage examples for com.badlogic.gdx.graphics.g3d.utils MeshPartBuilder index

Introduction

In this page you can find the example usage for com.badlogic.gdx.graphics.g3d.utils MeshPartBuilder index.

Prototype

public void index(final short value);

Source Link

Document

Add an index, MeshPartBuilder expects all meshes to be indexed.

Usage

From source file:com.badlogic.gdx.tests.dragome.examples.GearsDemo.java

private static Model gear(ModelBuilder builder, float inner_radius, float outer_radius, float width, int teeth,
        float tooth_depth, Color color) {
    // Ported from https://github.com/jeffboody/gears2/blob/master/project/jni/gear.c by xpenatan
    int i;//  w w  w . jav  a  2s .co  m
    float r0, r1, r2, dz;
    float angle, da;
    float u, v, len;

    float[] ar = new float[4];

    VertexInfo vertTmp1 = new VertexInfo();

    r0 = inner_radius;
    r1 = outer_radius - tooth_depth / 2.0f;
    r2 = outer_radius + tooth_depth / 2.0f;

    dz = 0.5f * width;

    builder.begin();

    MeshPartBuilder part = null;

    // draw front face
    // GL_TRIANGLE_STRIP
    part = builder.part("gear", GL20.GL_TRIANGLE_STRIP, Usage.Position | Usage.Normal,
            new Material(ColorAttribute.createDiffuse(color)));
    da = 2.0f * (float) Math.PI / teeth / 4.0f;
    for (i = 0; i < teeth; i++) {
        angle = i * 2.0f * (float) Math.PI / teeth;
        gear_angle(i, teeth, ar);
        part.index(
                part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(ar[0]), r0 * (float) Math.sin(ar[0]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(ar[0]), r0 * (float) Math.sin(ar[0]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), dz)));
    }
    part.index(part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(0.0f), r0 * (float) Math.sin(0.0f), dz)));
    part.index(part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(0.0f), r1 * (float) Math.sin(0.0f), dz)));

    // draw front sides of teeth
    // GL_TRIANGLES
    part = builder.part("gear", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal,
            new Material(ColorAttribute.createDiffuse(color)));
    for (i = 0; i < teeth; i++) {
        gear_angle(i, teeth, ar);
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[1]), r2 * (float) Math.sin(ar[1]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[2]), r2 * (float) Math.sin(ar[2]), dz)));

        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[2]), r2 * (float) Math.sin(ar[2]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), dz)));
    }

    // draw back face
    // GL_TRIANGLE_STRIP
    part = builder.part("gear", GL20.GL_TRIANGLE_STRIP, Usage.Position | Usage.Normal,
            new Material(ColorAttribute.createDiffuse(color)));
    for (i = 0; i < teeth; i++) {
        gear_angle(i, teeth, ar);

        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(ar[0]), r0 * (float) Math.sin(ar[0]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(ar[0]), r0 * (float) Math.sin(ar[0]), -dz)));
    }
    part.index(part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(0.0f), r1 * (float) Math.sin(0.0f), -dz)));
    part.index(part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(0.0f), r0 * (float) Math.sin(0.0f), -dz)));

    // draw back sides of teeth
    // GL_TRIANGLES
    part = builder.part("gear", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal,
            new Material(ColorAttribute.createDiffuse(color)));
    for (i = 0; i < teeth; i++) {
        gear_angle(i, teeth, ar);
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[2]), r2 * (float) Math.sin(ar[2]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[1]), r2 * (float) Math.sin(ar[1]), -dz)));

        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[1]), r2 * (float) Math.sin(ar[1]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), -dz)));

    }

    // draw outward faces of teeth
    // GL_TRIANGLE_STRIP
    // repeated vertices are necessary to achieve flat shading in ES2
    part = builder.part("gear", GL20.GL_TRIANGLE_STRIP, Usage.Position | Usage.Normal,
            new Material(ColorAttribute.createDiffuse(color)));
    for (i = 0; i < teeth; i++) {
        gear_angle(i, teeth, ar);
        vertTmp1.hasNormal = false;
        if (i > 0) {
            part.index(part
                    .vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), dz)));
            part.index(part
                    .vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), -dz)));
        }

        u = r2 * (float) Math.cos(ar[1]) - r1 * (float) Math.cos(ar[0]);
        v = r2 * (float) Math.sin(ar[1]) - r1 * (float) Math.sin(ar[0]);
        len = (float) Math.sqrt(u * u + v * v);
        u /= len;
        v /= len;

        vertTmp1.setNor(v, -u, 0.0f);
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[0]), r1 * (float) Math.sin(ar[0]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[1]), r2 * (float) Math.sin(ar[1]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[1]), r2 * (float) Math.sin(ar[1]), -dz)));

        vertTmp1.setNor((float) Math.cos(ar[0]), (float) Math.sin(ar[0]), 0.0f);
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[1]), r2 * (float) Math.sin(ar[1]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[1]), r2 * (float) Math.sin(ar[1]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[2]), r2 * (float) Math.sin(ar[2]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[2]), r2 * (float) Math.sin(ar[2]), -dz)));

        u = r1 * (float) Math.cos(ar[3]) - r2 * (float) Math.cos(ar[2]);
        v = r1 * (float) Math.sin(ar[3]) - r2 * (float) Math.sin(ar[2]);

        vertTmp1.setNor(v, -u, 0.0f);
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[2]), r2 * (float) Math.sin(ar[2]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r2 * (float) Math.cos(ar[2]), r2 * (float) Math.sin(ar[2]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), -dz)));

        vertTmp1.setNor((float) Math.cos(ar[0]), (float) Math.sin(ar[0]), 0.0f);
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(ar[3]), r1 * (float) Math.sin(ar[3]), -dz)));
    }
    vertTmp1.hasNormal = false;
    part.index(part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(0.0f), r1 * (float) Math.sin(0.0f), dz)));
    part.index(part.vertex(vertTmp1.setPos(r1 * (float) Math.cos(0.0f), r1 * (float) Math.sin(0.0f), -dz)));

    // draw inside radius cylinder
    // GL_TRIANGLE_STRIP
    part = builder.part("gear", GL20.GL_TRIANGLE_STRIP, Usage.Position | Usage.Normal,
            new Material(ColorAttribute.createDiffuse(color)));
    for (i = 0; i < teeth; i++) {
        gear_angle(i, teeth, ar);
        vertTmp1.setNor(-(float) Math.cos(ar[0]), -(float) Math.sin(ar[0]), 0.0f);
        part.index(
                part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(ar[0]), r0 * (float) Math.sin(ar[0]), -dz)));
        part.index(
                part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(ar[0]), r0 * (float) Math.sin(ar[0]), dz)));
    }
    vertTmp1.setNor(-(float) Math.cos(0.0f), -(float) Math.sin(0.0f), 0.0f);
    part.index(part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(0.0f), r0 * (float) Math.sin(0.0f), -dz)));
    part.index(part.vertex(vertTmp1.setPos(r0 * (float) Math.cos(0.0f), r0 * (float) Math.sin(0.0f), dz)));

    return builder.end();
}