Example usage for com.badlogic.gdx.graphics.glutils ShaderProgram NORMAL_ATTRIBUTE

List of usage examples for com.badlogic.gdx.graphics.glutils ShaderProgram NORMAL_ATTRIBUTE

Introduction

In this page you can find the example usage for com.badlogic.gdx.graphics.glutils ShaderProgram NORMAL_ATTRIBUTE.

Prototype

String NORMAL_ATTRIBUTE

To view the source code for com.badlogic.gdx.graphics.glutils ShaderProgram NORMAL_ATTRIBUTE.

Click Source Link

Document

default name for normal attributes

Usage

From source file:com.deepwallgames.quantumhue.ImmediateModeShader30.java

License:Apache License

static private String createVertexShader(boolean hasNormals, boolean hasColors, int numTexCoords) {
    String prefix = "#version 100\n";
    String shader = prefix + "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
            + (hasNormals ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + ";\n" : "")
            + (hasColors ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        shader += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n";
    }/*from   ww w .  j  a  v a 2 s.  co  m*/

    shader += "uniform mat4 u_projModelView;\n";
    shader += (hasColors ? "varying vec4 v_col;\n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        shader += "varying vec2 v_tex" + i + ";\n";
    }

    shader += "void main() {\n" + "   gl_Position = u_projModelView * " + ShaderProgram.POSITION_ATTRIBUTE
            + ";\n" + (hasColors ? "   v_col = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        shader += "   v_tex" + i + " = " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n";
    }
    shader += "   gl_PointSize = 1.0;\n";
    shader += "}\n";
    return shader;
}

From source file:com.gemserk.commons.gdx.graphics.Gdx2dMeshBuilder.java

License:Apache License

private VertexAttribute[] buildVertexAttributes(boolean hasNormals, boolean hasColor, int numTexCoords) {
    Array<VertexAttribute> attribs = new Array<VertexAttribute>();
    attribs.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE));
    if (hasNormals)
        attribs.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE));
    if (hasColor)
        attribs.add(new VertexAttribute(Usage.ColorPacked, 4, ShaderProgram.COLOR_ATTRIBUTE));
    for (int i = 0; i < numTexCoords; i++) {
        attribs.add(new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + i));
    }/*  w  w  w . j a  v  a 2  s .c  om*/
    VertexAttribute[] array = new VertexAttribute[attribs.size];
    for (int i = 0; i < attribs.size; i++)
        array[i] = attribs.get(i);
    return array;
}

From source file:com.iLoong.launcher.min3d.ObjLoader.java

License:Open Source License

/**
 * Loads a mesh from the given string in Wavefront OBJ format
 * /*from  www .ja v  a2  s .com*/
 * @param obj
 *            The string
 * @param flipV
 *            whether to flip the v texture coordinate or not
 * @param useIndices
 *            whether to create an array of indices or not
 * @return The Mesh
 */
public static Mesh loadObjFromString(String obj, boolean flipV, boolean useIndices, float offsetX,
        float offsetY, float offsetZ, float scaleX, float scaleY, float scaleZ) {
    String[] lines = obj.split("\n");
    float[] vertices = new float[lines.length * 3];
    float[] normals = new float[lines.length * 3];
    float[] uv = new float[lines.length * 3];
    int numVertices = 0;
    int numNormals = 0;
    int numUV = 0;
    int numFaces = 0;
    int[] facesVerts = new int[lines.length * 3];
    int[] facesNormals = new int[lines.length * 3];
    int[] facesUV = new int[lines.length * 3];
    int vertexIndex = 0;
    int normalIndex = 0;
    int uvIndex = 0;
    int faceIndex = 0;
    Color default_color = new Color(1.0f, 1.0f, 1.0f, 1.0f);
    for (int i = 0; i < lines.length; i++) {
        String line = lines[i];
        if (line.startsWith("v ")) {
            String[] tokens = line.split("[ ]+");
            float vertex_x = Float.parseFloat(tokens[1]);
            float vertex_y = Float.parseFloat(tokens[2]);
            float vertex_z = Float.parseFloat(tokens[3]);
            if (scaleX != 1f) {
                vertex_x = vertex_x * scaleX;
            }
            if (scaleY != 1f) {
                vertex_y = vertex_y * scaleY;
            }
            if (scaleZ != 1f) {
                vertex_z = vertex_z * scaleZ;
            }
            vertices[vertexIndex] = vertex_x + offsetX;
            vertices[vertexIndex + 1] = vertex_y + offsetY;
            vertices[vertexIndex + 2] = vertex_z + offsetZ;
            vertexIndex += 3;
            numVertices++;
            continue;
        }
        if (line.startsWith("vn ")) {
            String[] tokens = line.split("[ ]+");
            normals[normalIndex] = Float.parseFloat(tokens[1]);
            normals[normalIndex + 1] = Float.parseFloat(tokens[2]);
            normals[normalIndex + 2] = Float.parseFloat(tokens[3]);
            normalIndex += 3;
            numNormals++;
            continue;
        }
        if (line.startsWith("vt")) {
            String[] tokens = line.split("[ ]+");
            uv[uvIndex] = Float.parseFloat(tokens[1]);
            uv[uvIndex + 1] = flipV ? 1 - Float.parseFloat(tokens[2]) : Float.parseFloat(tokens[2]);
            uvIndex += 2;
            numUV++;
            continue;
        }
        if (line.startsWith("f ")) {
            String[] tokens = line.split("[ ]+");
            if (tokens.length == 5) {
                String[] parts = tokens[1].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                parts = tokens[2].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                parts = tokens[4].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                numFaces++;
                parts = tokens[2].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                parts = tokens[3].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                parts = tokens[4].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                numFaces++;
            } else {
                String[] parts = tokens[1].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                parts = tokens[2].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                parts = tokens[3].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                if (parts.length > 2)
                    facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                if (parts.length > 1)
                    facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                numFaces++;
            }
            continue;
        }
    }
    Mesh mesh = null;
    ArrayList<VertexAttribute> attributes = new ArrayList<VertexAttribute>();
    attributes.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE));
    attributes.add(new VertexAttribute(Usage.ColorPacked, 4, ShaderProgram.COLOR_ATTRIBUTE));
    if (numNormals > 0)
        attributes.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE));
    if (numUV > 0)
        attributes
                .add(new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + "0"));
    if (useIndices) {
        int attrCount = 4 + (numNormals > 0 ? 3 : 0) + (numUV > 0 ? 2 : 0);
        int normOffset = 4;
        int uvOffset = 4 + (numNormals > 0 ? 3 : 0);
        float verts[] = new float[numVertices * attrCount];
        for (int i = 0; i < numVertices; i++) {
            verts[i * attrCount] = vertices[i * 3];
            verts[i * attrCount + 1] = vertices[i * 3 + 1];
            verts[i * attrCount + 2] = vertices[i * 3 + 2];
            verts[i * attrCount + 3] = default_color.toFloatBits();
        }
        for (int i = 0; i < numFaces * 3; i++) {
            int vertexIdx = facesVerts[i];
            if (numNormals > 0) {
                int normalIdx = facesNormals[i] * 3;
                verts[vertexIdx * attrCount + normOffset] = normals[normalIdx];
                verts[vertexIdx * attrCount + normOffset + 1] = normals[normalIdx + 1];
                verts[vertexIdx * attrCount + normOffset + 2] = normals[normalIdx + 2];
            }
            if (numUV > 0) {
                int uvIdx = facesUV[i] * 2;
                verts[vertexIdx * attrCount + uvOffset] = uv[uvIdx];
                verts[vertexIdx * attrCount + uvOffset + 1] = uv[uvIdx + 1];
            }
        }
        short[] indices = new short[numFaces * 3];
        for (int i = 0; i < indices.length; i++)
            indices[i] = (short) facesVerts[i];
        mesh = new Mesh(null, true, verts.length, indices.length,
                attributes.toArray(new VertexAttribute[attributes.size()]));
        mesh.setVertices(verts);
        mesh.setIndices(indices);
    } else {
        float[] verts = new float[(numFaces * 3) * (4 + (numNormals > 0 ? 3 : 0) + (numUV > 0 ? 2 : 0))];
        for (int i = 0, vi = 0; i < numFaces * 3; i++) {
            int vertexIdx = facesVerts[i] * 3;
            verts[vi++] = vertices[vertexIdx];
            verts[vi++] = vertices[vertexIdx + 1];
            verts[vi++] = vertices[vertexIdx + 2];
            verts[vi++] = default_color.toFloatBits();
            if (numNormals > 0) {
                int normalIdx = facesNormals[i] * 3;
                verts[vi++] = normals[normalIdx];
                verts[vi++] = normals[normalIdx + 1];
                verts[vi++] = normals[normalIdx + 2];
            }
            if (numUV > 0) {
                int uvIdx = facesUV[i] * 2;
                verts[vi++] = uv[uvIdx];
                verts[vi++] = uv[uvIdx + 1];
            }
        }
        mesh = new Mesh(null, true, numFaces * 3, 0,
                attributes.toArray(new VertexAttribute[attributes.size()]));
        mesh.setVertices(verts);
    }
    return mesh;
}

From source file:com.kevlanche.threedeetest.ScalableObjLoader.java

License:Apache License

protected ModelData loadModelData(FileHandle file, boolean flipV) {
    String line;/* w w  w. ja va 2  s.c o m*/
    String[] tokens;
    char firstChar;
    MtlLoader mtl = new MtlLoader();

    // Create a "default" Group and set it as the active group, in case
    // there are no groups or objects defined in the OBJ file.
    Group activeGroup = new Group("default");
    groups.add(activeGroup);

    BufferedReader reader = new BufferedReader(new InputStreamReader(file.read()), 4096);
    int id = 0;
    try {
        while ((line = reader.readLine()) != null) {

            tokens = line.split("\\s+");
            if (tokens.length < 1)
                break;

            if (tokens[0].length() == 0) {
                continue;
            } else if ((firstChar = tokens[0].toLowerCase().charAt(0)) == '#') {
                continue;
            } else if (firstChar == 'v') {
                if (tokens[0].length() == 1) {
                    verts.add(Float.parseFloat(tokens[1]) * this.objScale);
                    verts.add(Float.parseFloat(tokens[2]) * this.objScale);
                    verts.add(Float.parseFloat(tokens[3]) * this.objScale);
                } else if (tokens[0].charAt(1) == 'n') {
                    norms.add(Float.parseFloat(tokens[1]));
                    norms.add(Float.parseFloat(tokens[2]));
                    norms.add(Float.parseFloat(tokens[3]));
                } else if (tokens[0].charAt(1) == 't') {
                    uvs.add(Float.parseFloat(tokens[1]));
                    uvs.add((flipV ? 1 - Float.parseFloat(tokens[2]) : Float.parseFloat(tokens[2])));
                }
            } else if (firstChar == 'f') {
                String[] parts;
                Array<Integer> faces = activeGroup.faces;
                for (int i = 1; i < tokens.length - 2; i--) {
                    parts = tokens[1].split("/");
                    faces.add(getIndex(parts[0], verts.size));
                    if (parts.length > 2) {
                        if (i == 1)
                            activeGroup.hasNorms = true;
                        faces.add(getIndex(parts[2], norms.size));
                    }
                    if (parts.length > 1 && parts[1].length() > 0) {
                        if (i == 1)
                            activeGroup.hasUVs = true;
                        faces.add(getIndex(parts[1], uvs.size));
                    }
                    parts = tokens[++i].split("/");
                    faces.add(getIndex(parts[0], verts.size));
                    if (parts.length > 2)
                        faces.add(getIndex(parts[2], norms.size));
                    if (parts.length > 1 && parts[1].length() > 0)
                        faces.add(getIndex(parts[1], uvs.size));
                    parts = tokens[++i].split("/");
                    faces.add(getIndex(parts[0], verts.size));
                    if (parts.length > 2)
                        faces.add(getIndex(parts[2], norms.size));
                    if (parts.length > 1 && parts[1].length() > 0)
                        faces.add(getIndex(parts[1], uvs.size));
                    activeGroup.numFaces++;
                }
            } else if (firstChar == 'o' || firstChar == 'g') {
                // This implementation only supports single object or group
                // definitions. i.e. "o group_a group_b" will set group_a
                // as the active group, while group_b will simply be
                // ignored.
                if (tokens.length > 1)
                    activeGroup = setActiveGroup(tokens[1]);
                else
                    activeGroup = setActiveGroup("default");
            } else if (tokens[0].equals("mtllib")) {
                mtl.load(file.parent().child(tokens[1]));
            } else if (tokens[0].equals("usemtl")) {
                if (tokens.length == 1)
                    activeGroup.materialName = "default";
                else
                    activeGroup.materialName = tokens[1];
            }
        }
        reader.close();
    } catch (IOException e) {
        return null;
    }

    // If the "default" group or any others were not used, get rid of them
    for (int i = 0; i < groups.size; i++) {
        if (groups.get(i).numFaces < 1) {
            groups.removeIndex(i);
            i--;
        }
    }

    // If there are no groups left, there is no valid Model to return
    if (groups.size < 1)
        return null;

    // Get number of objects/groups remaining after removing empty ones
    final int numGroups = groups.size;

    final ModelData data = new ModelData();

    for (int g = 0; g < numGroups; g++) {
        Group group = groups.get(g);
        Array<Integer> faces = group.faces;
        final int numElements = faces.size;
        final int numFaces = group.numFaces;
        final boolean hasNorms = group.hasNorms;
        final boolean hasUVs = group.hasUVs;

        final float[] finalVerts = new float[(numFaces * 3) * (3 + (hasNorms ? 3 : 0) + (hasUVs ? 2 : 0))];

        for (int i = 0, vi = 0; i < numElements;) {
            int vertIndex = faces.get(i++) * 3;
            finalVerts[vi++] = verts.get(vertIndex++);
            finalVerts[vi++] = verts.get(vertIndex++);
            finalVerts[vi++] = verts.get(vertIndex);
            if (hasNorms) {
                int normIndex = faces.get(i++) * 3;
                finalVerts[vi++] = norms.get(normIndex++);
                finalVerts[vi++] = norms.get(normIndex++);
                finalVerts[vi++] = norms.get(normIndex);
            }
            if (hasUVs) {
                int uvIndex = faces.get(i++) * 2;
                finalVerts[vi++] = uvs.get(uvIndex++);
                finalVerts[vi++] = uvs.get(uvIndex);
            }
        }

        final int numIndices = numFaces * 3 >= Short.MAX_VALUE ? 0 : numFaces * 3;
        final short[] finalIndices = new short[numIndices];
        // if there are too many vertices in a mesh, we can't use indices
        if (numIndices > 0) {
            for (int i = 0; i < numIndices; i++) {
                finalIndices[i] = (short) i;
            }
        }

        Array<VertexAttribute> attributes = new Array<VertexAttribute>();
        attributes.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE));
        if (hasNorms)
            attributes.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE));
        if (hasUVs)
            attributes.add(
                    new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + "0"));

        String nodeId = "node" + (++id);
        String meshId = "mesh" + id;
        String partId = "part" + id;
        ModelNode node = new ModelNode();
        node.id = nodeId;
        node.meshId = meshId;
        node.scale = new Vector3(1, 1, 1);
        node.translation = new Vector3();
        node.rotation = new Quaternion();
        ModelNodePart pm = new ModelNodePart();
        pm.meshPartId = partId;
        pm.materialId = group.materialName;
        node.parts = new ModelNodePart[] { pm };
        ModelMeshPart part = new ModelMeshPart();
        part.id = partId;
        part.indices = finalIndices;
        part.primitiveType = GL10.GL_TRIANGLES;
        ModelMesh mesh = new ModelMesh();
        mesh.id = meshId;
        mesh.attributes = attributes.toArray(VertexAttribute.class);
        mesh.vertices = finalVerts;
        mesh.parts = new ModelMeshPart[] { part };
        data.nodes.add(node);
        data.meshes.add(mesh);
        ModelMaterial mm = mtl.getMaterial(group.materialName);
        data.materials.add(mm);
    }

    //for (ModelMaterial m : mtl.materials)
    //data.materials.add(m);

    // An instance of ObjLoader can be used to load more than one OBJ.
    // Clearing the Array cache instead of instantiating new
    // Arrays should result in slightly faster load times for
    // subsequent calls to loadObj
    if (verts.size > 0)
        verts.clear();
    if (norms.size > 0)
        norms.clear();
    if (uvs.size > 0)
        uvs.clear();
    if (groups.size > 0)
        groups.clear();

    return data;
}

From source file:gaia.cu9.ari.gaiaorbit.util.g3d.ImmediateRenderer.java

License:Apache License

static private String createVertexShader(boolean hasNormals, boolean hasColors, int numTexCoords) {
    String shader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
            + (hasNormals ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + ";\n" : "")
            + (hasColors ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        shader += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n";
    }//from w  w  w  .  j a va2 s .c  o m

    shader += "uniform mat4 u_projModelView;\n";
    shader += (hasColors ? "varying vec4 v_col;\n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        shader += "varying vec2 v_tex" + i + ";\n";
    }

    shader += "void main() {\n" + "   gl_Position = u_projModelView * " + ShaderProgram.POSITION_ATTRIBUTE
            + ";\n" + (hasColors ? "   v_col = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        shader += "   v_tex" + i + " = " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n";
    }
    shader += "   gl_PointSize = 1.0;\n";
    shader += "}\n";
    return shader;
}

From source file:gaia.cu9.ari.gaiaorbit.util.g3d.MeshBuilder2.java

License:Apache License

/** @param usage bitwise mask of the {@link com.badlogic.gdx.graphics.VertexAttributes.Usage}, only Position, Color, Normal and
 *           TextureCoordinates is supported. */
public static VertexAttributes createAttributes(long usage) {
    final Array<VertexAttribute> attrs = new Array<VertexAttribute>();
    if ((usage & Usage.Position) == Usage.Position)
        attrs.add(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE));
    if ((usage & Usage.ColorUnpacked) == Usage.ColorUnpacked)
        attrs.add(new VertexAttribute(Usage.ColorUnpacked, 4, ShaderProgram.COLOR_ATTRIBUTE));
    if ((usage & Usage.ColorPacked) == Usage.ColorPacked)
        attrs.add(new VertexAttribute(Usage.ColorPacked, 4, ShaderProgram.COLOR_ATTRIBUTE));
    if ((usage & Usage.Normal) == Usage.Normal)
        attrs.add(new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE));
    if ((usage & Usage.TextureCoordinates) == Usage.TextureCoordinates)
        attrs.add(new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + "0"));
    final VertexAttribute attributes[] = new VertexAttribute[attrs.size];
    for (int i = 0; i < attributes.length; i++)
        attributes[i] = attrs.get(i);//from   w  w w.j a v a  2  s  .c o  m
    return new VertexAttributes(attributes);
}

From source file:mobi.shad.s3lib.gfx.g3d.shaders.BaseShader.java

License:Apache License

/**
 * @return/*  www  . j  a  va 2  s .  c  o  m*/
 */
protected String createVertexShader() {
    String vertexProgram = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
            + (hasNormal ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + ";   \n" : "")
            + (hasColor ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";      \n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        vertexProgram += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n";
    }

    vertexProgram += (hasColor ? "varying vec4 v_col;                        \n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        vertexProgram += "varying vec2 v_tex" + i + ";                        \n";
    }

    for (ObjectMap.Entry<String, Paramets> parameter : uniforms) {
        if (parameter.value.isVertex) {
            switch (parameter.value.valueType) {
            case MATRIX4:
                vertexProgram += "uniform mat4 " + parameter.key + ";\n";
                break;
            }
        }
    }
    if (vertexInit != null && vertexInit.length() > 0) {
        vertexProgram += vertexInit;
    }

    vertexProgram += "void main() {                                             \n"
            + "   gl_Position = u_projectionMatrix * u_modelViewMatrix * " + ShaderProgram.POSITION_ATTRIBUTE
            + ";\n" + (hasColor ? "   v_col = " + ShaderProgram.COLOR_ATTRIBUTE + ";         \n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        vertexProgram += "   v_tex" + i + " = " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n";
    }

    if (vertexMain != null && vertexMain.length() > 0) {
        vertexProgram += vertexMain;
    }

    vertexProgram += "}              \n";

    if (S3Constans.DEBUG) {
        S3Log.logNumerLines("DefaultShader::vertexProgram", vertexProgram);
    }

    return vertexProgram;
}

From source file:mobi.shad.s3lib.gfx.g3d.shaders.SimpleShader.java

License:Apache License

/**
 * @return// w ww  .ja  va 2  s  .co  m
 */
protected String createVertexShader() {
    String vertexProgram = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
            + (hasNormal ? "attribute vec3 " + ShaderProgram.NORMAL_ATTRIBUTE + ";   \n" : "")
            + (hasColor ? "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";      \n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        vertexProgram += "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + i + ";\n";
    }

    vertexProgram += (hasColor ? "varying vec4 v_col;                        \n" : "");

    for (int i = 0; i < numTexCoords; i++) {
        vertexProgram += "varying vec2 v_tex" + i + ";                        \n";
    }

    for (ObjectMap.Entry<String, Paramets> parameter : uniforms) {
        if (parameter.value.isVertex) {
            switch (parameter.value.valueType) {
            case MATRIX4:
                vertexProgram += "uniform mat4 " + parameter.key + ";\n";
                break;
            }
        }
    }

    if (vertexMain != null && vertexMain.length() > 0) {
        vertexProgram += vertexMain;
    }

    if (S3Constans.DEBUG) {
        S3Log.logNumerLines("DefaultShader::vertexProgram", vertexProgram);
    }

    return vertexProgram;
}