Java Code Examples for com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder#VertexInfo

The following examples show how to use com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder#VertexInfo . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: Terrain.java    From Mundus with Apache License 2.0 6 votes vote down vote up
private void setVertex(int index, MeshPartBuilder.VertexInfo info) {
    index *= stride;
    if (posPos >= 0) {
        vertices[index + posPos] = info.position.x;
        vertices[index + posPos + 1] = info.position.y;
        vertices[index + posPos + 2] = info.position.z;
    }
    if (uvPos >= 0) {
        vertices[index + uvPos] = info.uv.x;
        vertices[index + uvPos + 1] = info.uv.y;
    }
    if (norPos >= 0) {
        vertices[index + norPos] = info.normal.x;
        vertices[index + norPos + 1] = info.normal.y;
        vertices[index + norPos + 2] = info.normal.z;
    }
}
 
Example 2
Source File: ModelPlacementTool.java    From Mundus with Apache License 2.0 6 votes vote down vote up
@Override
public boolean mouseMoved(int screenX, int screenY) {
    if (this.model == null || modelInstance == null) return false;

    final ProjectContext context = getProjectManager().current();

    final Ray ray = getProjectManager().current().currScene.viewport.getPickRay(screenX, screenY);
    if (context.currScene.terrains.size > 0 && modelInstance != null) {
        MeshPartBuilder.VertexInfo vi = TerrainUtils.getRayIntersectionAndUp(context.currScene.terrains, ray);
        if (vi != null) {
            if (shouldRespectTerrainSlope) {
                modelInstance.transform.setToLookAt(DEFAULT_ORIENTATION, vi.normal);
            }
            modelInstance.transform.setTranslation(vi.position);
        }
    } else {
        tempV3.set(getProjectManager().current().currScene.cam.position);
        tempV3.add(ray.direction.nor().scl(200));
        modelInstance.transform.setTranslation(tempV3);
    }

    return false;
}
 
Example 3
Source File: HeightMapModel.java    From gdx-proto with Apache License 2.0 6 votes vote down vote up
private void buildTriangles() {
	//System.out.printf("chunk: startXZ: %d, %d -- length: %d\n", startX, startZ, length);
	int count = 0;
	MeshPartBuilder.VertexInfo right;
	MeshPartBuilder.VertexInfo down;
	MeshPartBuilder.VertexInfo downRight;
	for (int z = 0; z < vertexInfos.length - 1; z++) {
		for (int x = 0; x < (vertexInfos[0].length - 1); x++) {
			MeshPartBuilder.VertexInfo vert = vertexInfos[z][x];
			right = vertexInfos[z][x+1];
			down = vertexInfos[z+1][x];
			downRight = vertexInfos[z+1][x+1];
			// each z row has two trianagles forming a rect
			int xIdx = x*2;
			Triangle top = new Triangle(z, xIdx, vert, down, right);
			Triangle bottom = new Triangle(z, xIdx+1, downRight, right, down);
			count += 2;
		}
	}
	System.out.println("built " + count + " triangles");
}
 
Example 4
Source File: HeightMapModel.java    From gdx-proto with Apache License 2.0 6 votes vote down vote up
private void setVertexPositions() {
	// store vertex info for second pass where we calculate vertex normals for per-vertex lighting
	float[][] pts = heightMap.heights;
	float blockSize = heightMap.getWidthScale();
	float heightScale = heightMap.getHeightScale();
	float width = heightMap.getWidthWorld();
	float depth = heightMap.getDepthWorld();
	for (int z = 0; z < pts.length; z++) {
		for (int x = 0; x < pts[z].length; x++) {
			float y = pts[z][x];
			MeshPartBuilder.VertexInfo thisVert = new MeshPartBuilder.VertexInfo();
			thisVert.setPos(x * blockSize, y * heightScale, z * blockSize);
			// set texture UV
			float u = (x * blockSize) / width;
			float v = (z * blockSize) / depth;
			float scl = heightScale;
			scl = 1f;
			thisVert.setUV(u * scl, v * scl);
			vertexInfos[z][x] = thisVert;
		}
	}
}
 
Example 5
Source File: HeightMapModel.java    From gdx-proto with Apache License 2.0 6 votes vote down vote up
public Triangle(int triZ, int triX, MeshPartBuilder.VertexInfo a, MeshPartBuilder.VertexInfo b, MeshPartBuilder.VertexInfo c) {
	zidx = triZ;
	xidx = triX;
	try {
		tris[triZ][triX] = this;
	} catch (ArrayIndexOutOfBoundsException e) {
		e.printStackTrace();
		Tools.sleep(500);
		System.out.println("tried ZX: " + triZ + ", " + triX);
		System.out.println("length ZX: " + tris.length + ", " + tris[0].length);
		System.exit(5);
	}
	this.a = a;
	this.b = b;
	this.c = c;
	this.calculateFaceNormal();
}
 
Example 6
Source File: GrassRenderer.java    From Radix with MIT License 5 votes vote down vote up
@Override
public void renderTop(int atlasIndex, float x1, float z1, float x2, float z2, float y, float lightLevel, PerCornerLightData pcld, MeshBuilder builder) {
    float u = getU(atlasIndex);
    float v = getV(atlasIndex);
    builder.setUVRange(u, v, u, v);

    MeshPartBuilder.VertexInfo c00 = new MeshPartBuilder.VertexInfo().setPos(x1, y, z1).setNor(0, 1, 0);
    MeshPartBuilder.VertexInfo c01 = new MeshPartBuilder.VertexInfo().setPos(x1, y, z2).setNor(0, 1, 0);
    MeshPartBuilder.VertexInfo c10 = new MeshPartBuilder.VertexInfo().setPos(x2, y, z1).setNor(0, 1, 0);
    MeshPartBuilder.VertexInfo c11 = new MeshPartBuilder.VertexInfo().setPos(x2, y, z2).setNor(0, 1, 0);

    IChunk chunk = RadixClient.getInstance().getWorld().getChunk((int) x1, (int) z1);
    Biome biome;
    if(chunk != null) {
        biome = chunk.getBiome();
    } else {
        biome = RadixAPI.instance.getBiomeByID(0);
    }
    int[] color = biome.getGrassColor((int) y - 1);
    float r = color[0]/255f;
    float g = color[1]/255f;
    float b = color[2]/255f;
    if(pcld == null) {
        builder.setColor(r*lightLevel, g*lightLevel, b*lightLevel, 1);
    } else {
        c00.setCol(r*pcld.l00, g*pcld.l00, b*pcld.l00, 1);
        c01.setCol(r*pcld.l01, g*pcld.l01, b*pcld.l01, 1);
        c10.setCol(r*pcld.l10, g*pcld.l10, b*pcld.l10, 1);
        c11.setCol(r*pcld.l11, g*pcld.l11, b*pcld.l11, 1);
    }

    builder.rect(c01, c11, c10, c00);
}
 
Example 7
Source File: Terrain.java    From Mundus with Apache License 2.0 5 votes vote down vote up
private MeshPartBuilder.VertexInfo calculateVertexAt(MeshPartBuilder.VertexInfo out, int x, int z) {
    final float dx = (float) x / (float) (vertexResolution - 1);
    final float dz = (float) z / (float) (vertexResolution - 1);
    final float height = heightData[z * vertexResolution + x];

    out.position.set(dx * this.terrainWidth, height, dz * this.terrainDepth);
    out.uv.set(dx, dz).scl(uvScale);

    return out;
}
 
Example 8
Source File: HeightMapModel.java    From gdx-proto with Apache License 2.0 5 votes vote down vote up
private void createGround() {
	if (++timesCreated > 1) {
		throw new GdxRuntimeException("can't create heightmap more than one time");
	}
	vertexInfos = new MeshPartBuilder.VertexInfo[heightMap.heights.length][heightMap.heights[0].length];
	int trisHeight = (heightMap.getWidth() - 1);
	int trisWidth = (heightMap.getWidth() - 1) * 2;
	System.out.printf("tris zHeight,xWidth: %d, %d\n", trisHeight, trisWidth);
	tris = new Triangle[trisHeight][trisWidth];
	setVertexPositions(); // iterate through height map points, setting world coordinates
	buildTriangles(); // abstraction of the triangles that create the mesh
	// useful for calculating vertex normals, since each triangle stores a face normal
	// but somewhat wasteful of memory
	// TODO: optimize
	calculateVertexNormals(); // calculate vertex normals for per-vertex lighting
	final int chunkSize = 32;
	int z = 0;
	int zRemain = (int) Math.ceil(heightMap.getDepth() / chunkSize);
	if (zRemain == 0) zRemain = 1;
	int baseXRemain = (int) Math.ceil(heightMap.getWidth() / chunkSize);
	if (baseXRemain == 0) baseXRemain = 1;
	System.out.println("z chunks: " + zRemain + ", x chunks: " + baseXRemain);
	while (zRemain > 0) {
		int xRemain = baseXRemain;
		int x = 0;
		while (xRemain > 0) {
			buildGroundModels(x, z, chunkSize);
			xRemain--;
			x += chunkSize*2;
		}
		zRemain--;
		z += chunkSize;
	}
}
 
Example 9
Source File: HeightMapModel.java    From gdx-proto with Apache License 2.0 5 votes vote down vote up
private void calculateVertexNormals() {
	int count = 0;
	for (int z = 0; z < vertexInfos.length; z++) {
		for (int x = 0; x < vertexInfos[z].length; x++) {
			MeshPartBuilder.VertexInfo vert = vertexInfos[z][x];
			// calculate normals
			vert.setNor(calculateNormalForVertex(z, x));

		}
	}
	System.out.print("vertex count: " + count + ", ");

}
 
Example 10
Source File: Tools.java    From gdx-proto with Apache License 2.0 5 votes vote down vote up
public static String fmt(MeshPartBuilder.VertexInfo vi, String name) {
	if (name == null) name = "";
	StringBuilder sb = new StringBuilder();
	sb.append("VertexInfo: ").append(name).append("\n");
	sb.append("\t").append(fmt(vi.position, "position")).append("\n");
	sb.append("\t").append(fmt(vi.color)).append("\n");
	sb.append("\t").append(fmt(vi.normal, "normal"));
	return sb.toString();
}
 
Example 11
Source File: Terrain.java    From Mundus with Apache License 2.0 4 votes vote down vote up
/**
 * Calculates normal of a vertex at x,y based on the verticesOnZ of the
 * surrounding vertices
 */
private MeshPartBuilder.VertexInfo calculateNormalAt(MeshPartBuilder.VertexInfo out, int x, int y) {
    out.normal.set(getNormalAt(x, y));
    return out;
}
 
Example 12
Source File: UsefulMeshs.java    From Mundus with Apache License 2.0 4 votes vote down vote up
public static Model torus(Material mat, float width, float height, int divisionsU, int divisionsV) {

        ModelBuilder modelBuilder = new ModelBuilder();
        modelBuilder.begin();
        MeshPartBuilder builder = modelBuilder.part("torus", GL20.GL_TRIANGLES, VertexAttributes.Usage.Position, mat);
        // builder.setColor(Color.LIGHT_GRAY);

        MeshPartBuilder.VertexInfo curr1 = v0.set(null, null, null, null);
        curr1.hasUV = curr1.hasNormal = false;
        curr1.hasPosition = true;

        MeshPartBuilder.VertexInfo curr2 = v1.set(null, null, null, null);
        curr2.hasUV = curr2.hasNormal = false;
        curr2.hasPosition = true;
        short i1, i2, i3 = 0, i4 = 0;

        int i, j, k;
        double s, t, twopi;
        twopi = 2 * Math.PI;

        for (i = 0; i < divisionsV; i++) {
            for (j = 0; j <= divisionsU; j++) {
                for (k = 1; k >= 0; k--) {
                    s = (i + k) % divisionsV + 0.5;
                    t = j % divisionsU;

                    curr1.position.set(
                            (float) ((width + height * Math.cos(s * twopi / divisionsV))
                                    * Math.cos(t * twopi / divisionsU)),
                            (float) ((width + height * Math.cos(s * twopi / divisionsV))
                                    * Math.sin(t * twopi / divisionsU)),
                            (float) (height * Math.sin(s * twopi / divisionsV)));
                    k--;
                    s = (i + k) % divisionsV + 0.5;
                    curr2.position.set(
                            (float) ((width + height * Math.cos(s * twopi / divisionsV))
                                    * Math.cos(t * twopi / divisionsU)),
                            (float) ((width + height * Math.cos(s * twopi / divisionsV))
                                    * Math.sin(t * twopi / divisionsU)),
                            (float) (height * Math.sin(s * twopi / divisionsV)));
                    // curr2.uv.set((float) s, 0);
                    i1 = builder.vertex(curr1);
                    i2 = builder.vertex(curr2);
                    builder.rect(i4, i2, i1, i3);
                    i4 = i2;
                    i3 = i1;
                }
            }
        }

        return modelBuilder.end();
    }
 
Example 13
Source File: Tools.java    From gdx-proto with Apache License 2.0 4 votes vote down vote up
public static String fmt(MeshPartBuilder.VertexInfo vi) {
	return fmt(vi, null);
}
 
Example 14
Source File: Tools.java    From gdx-proto with Apache License 2.0 4 votes vote down vote up
public static void print(MeshPartBuilder.VertexInfo vi) {
	System.out.println(fmt(vi, null));
}
 
Example 15
Source File: Tools.java    From gdx-proto with Apache License 2.0 4 votes vote down vote up
public static void print(MeshPartBuilder.VertexInfo vi, String name) {
	System.out.println(fmt(vi, name));
}