Beispiel #1
0
  @Override
  public void resize(int width, int height) {
    super.resize(width, height);

    mWorldState.width = width;
    mWorldState.height = height;
    mWorldState.rotate = width > height ? 1 : 0;

    mScript.set_g_glWidth(mWorldState.width);
    mScript.set_g_glHeight(mWorldState.height);
    mScript.set_g_rotate(mWorldState.rotate);

    mScript.invoke_initLeaves();

    Matrix4f proj = new Matrix4f();
    proj.loadProjectionNormalized(mWidth, mHeight);
    mPvOrthoAlloc.setProjection(proj);
  }
Beispiel #2
0
  private Matrix4f getProjectionNormalized(int w, int h) {
    // range -1,1 in the narrow axis at z = 0.
    Matrix4f m1 = new Matrix4f();
    Matrix4f m2 = new Matrix4f();

    if (w > h) {
      float aspect = ((float) w) / h;
      m1.loadFrustum(-aspect, aspect, -1, 1, 1, 100);
    } else {
      float aspect = ((float) h) / w;
      m1.loadFrustum(-1, 1, -aspect, aspect, 1, 100);
    }

    m2.loadRotate(180, 0, 1, 0);
    m1.loadMultiply(m1, m2);

    m2.loadScale(-1, 1, 1);
    m1.loadMultiply(m1, m2);

    m2.loadTranslate(0, 0, 1);
    m1.loadMultiply(m1, m2);
    return m1;
  }
Beispiel #3
0
  private void createProgramVertex() {
    mPvOrthoAlloc = new ProgramVertexFixedFunction.Constants(mRS);
    Matrix4f proj = new Matrix4f();
    proj.loadProjectionNormalized(mWidth, mHeight);
    mPvOrthoAlloc.setProjection(proj);

    ProgramVertexFixedFunction.Builder builder = new ProgramVertexFixedFunction.Builder(mRS);
    mPvSky = builder.create();
    ((ProgramVertexFixedFunction) mPvSky).bindConstants(mPvOrthoAlloc);

    mScript.set_g_PVSky(mPvSky);

    mConstants = new ScriptField_Constants(mRS, 1);
    mUniformAlloc = mConstants.getAllocation();

    ProgramVertex.Builder sb = new ProgramVertex.Builder(mRS);

    String t =
        "\n"
            + "varying vec4 varColor;\n"
            + "varying vec2 varTex0;\n"
            + "vec2 addDrop(vec4 d, vec2 pos, float dxMul) {\n"
            + "  vec2 ret = vec2(0.0, 0.0);\n"
            + "  vec2 delta = d.xy - pos;\n"
            + "  delta.x *= dxMul;\n"
            + "  float dist = length(delta);\n"
            + "  if (dist < d.w) { \n"
            + "    float amp = d.z * dist;\n"
            + "    amp /= d.w * d.w;\n"
            + "    amp *= sin(d.w - dist);\n"
            + "    ret = delta * amp;\n"
            + "  }\n"
            + "  return ret;\n"
            + "}\n"
            + "void main() {\n"
            + "  vec2 pos = ATTRIB_position.xy;\n"
            + "  gl_Position = vec4(pos.x, pos.y, 0.0, 1.0);\n"
            + "  float dxMul = 1.0;\n"
            + "  varTex0 = vec2((pos.x + 1.0), (pos.y + 1.6666));\n"
            + "  if (UNI_Rotate < 0.9) {\n"
            + "    varTex0.xy *= vec2(0.25, 0.33);\n"
            + "    varTex0.x += UNI_Offset.x * 0.5;\n"
            + "    pos.x += UNI_Offset.x * 2.0;\n"
            + "  } else {\n"
            + "    varTex0.xy *= vec2(0.5, 0.3125);\n"
            + "    dxMul = 2.5;\n"
            + "  }\n"
            + "  varColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
            + "  pos.xy += vec2(1.0, 1.0);\n"
            + "  pos.xy *= vec2(25.0, 42.0);\n"
            + "  varTex0.xy += addDrop(UNI_Drop01, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop02, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop03, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop04, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop05, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop06, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop07, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop08, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop09, pos, dxMul);\n"
            + "  varTex0.xy += addDrop(UNI_Drop10, pos, dxMul);\n"
            + "}\n";

    sb.setShader(t);
    sb.addConstant(mUniformAlloc.getType());
    sb.addInput(mMesh.getVertexAllocation(0).getType().getElement());
    mPvWater = sb.create();
    mPvWater.bindConstants(mUniformAlloc, 0);

    mScript.set_g_PVWater(mPvWater);
  }