Android Open Source - flingbox Scene Renderer






From Project

Back to project page flingbox.

License

The source code is released under:

GNU General Public License

If you think the Android project flingbox listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 *  Flingbox - An OpenSource physics sandbox for Google's Android
 *  Copyright (C) 2009  Jon Ander Pealba & Endika Gutirrez
 */*from  w w w  . j ava2  s . c  om*/
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package edu.eside.flingbox.graphics;

import java.util.ArrayList;
import java.util.concurrent.Semaphore;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import edu.eside.flingbox.Preferences;

import android.opengl.GLSurfaceView.Renderer;

/**
 * {@link SceneRenderer} handles functions to render 
 * {@link Scene} into {@link GLSurfaceView} space by 
 * {@link Renderer} interface.
 *
 * Defines {@link Renderizable} interface witch should be 
 * implemented by on scene bodys to be rendered.
 */
public class SceneRenderer implements Renderer {
  /** Stores objects that will be renderized */
  private final ArrayList<RenderBody> mGraphicsToRender = new ArrayList<RenderBody>();
  /** Manages mGraphicsToRender access */
  private final Semaphore mGraphicsToRenderMutex = new Semaphore(1, true);
  
  /** Camera for this scene */
  private RenderCamera mCamera = new RenderCamera(100, 100);
  
  /**
   * Adds one object to be rendered.
   * 
   * @param render object
   */
  public void add(RenderBody render) {
    try { // Wait until everything rendered
      mGraphicsToRenderMutex.acquire();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    mGraphicsToRender.add(render);
    mGraphicsToRenderMutex.release();
  }
  
  /**
   * Removes object from scene
   * 
   * @param render Render to be removed
   * @return true if removed, else false
   */
  public boolean remove(RenderBody render) {
    try { // Wait until everything rendered
      mGraphicsToRenderMutex.acquire();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    boolean succeed = mGraphicsToRender.remove(render);
    mGraphicsToRenderMutex.release();
    return succeed;
  }
  
  /**
   * @return  Camera for current scene
   */
  public RenderCamera getCamera() {
    return mCamera;
  }
  
  /**
   * Called to draw the current frame.
   */
  @Override
  public synchronized void onDrawFrame(GL10 gl) {
    if (mCamera.isChanged) {
      /* Set camera. */
      gl.glMatrixMode(GL10.GL_PROJECTION);
      gl.glLoadIdentity();
      gl.glOrthof(mCamera.left, mCamera.rigth, mCamera.bottom, mCamera.top, 0, 1);
      gl.glShadeModel(GL10.GL_FLAT);
      // gl.glFrustrumf(...); // We are working with orthogonal projection
      mCamera.isChanged = false;
    }
      
    /* Set up OpenGL's Scene */
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glLoadIdentity();

    /* Set background color */
    gl.glClearColor(Preferences.backgroundColor[0], Preferences.backgroundColor[1], 
        Preferences.backgroundColor[2], 1.0f);

    /* Render All objectsCount */
    final ArrayList<RenderBody> renders = mGraphicsToRender;
      
    try {
      mGraphicsToRenderMutex.acquire();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    for (RenderBody r : renders) {
      /* Work with new stacked matrix */
      gl.glPushMatrix();
      gl.glLoadIdentity();
      r.onRender(gl);
      gl.glPopMatrix();
    }
    mGraphicsToRenderMutex.release();
    /* End drawing */
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  }

  /**
   * Called when the surface is resized and after onSurfaceCreated.
   */
  @Override
  public void onSurfaceChanged(GL10 gl, int width, int height) { 
    /* Create camera for current surface */
    mCamera.setSurface(width, height);
    
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    //gl.glOrthof(mCameraLeft, mCameraRigth, mCameraBottom, mCameraTop, 0, 1);
    gl.glShadeModel(GL10.GL_FLAT);

    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  }

  /**
   * First called when Surface is Created.
   */
  @Override
  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // Disable some features that we won't need in 2D,
    // Just for better performance.
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glDisable(GL10.GL_DITHER);
    gl.glDisable(GL10.GL_LIGHTING);
    gl.glDisable(GL10.GL_TEXTURE_2D);  // We won't need textures

    gl.glClearColor(0, 0, 0, 1);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

  }
  
}




Java Source Code List

edu.eside.flingbox.BodySettingsDialog.java
edu.eside.flingbox.FlingboxActivity.java
edu.eside.flingbox.PreferencesActivity.java
edu.eside.flingbox.Preferences.java
edu.eside.flingbox.bodies.Body.java
edu.eside.flingbox.bodies.Polygon.java
edu.eside.flingbox.graphics.RenderBody.java
edu.eside.flingbox.graphics.RenderCamera.java
edu.eside.flingbox.graphics.RenderPolygon.java
edu.eside.flingbox.graphics.SceneRenderer.java
edu.eside.flingbox.input.SceneGestureDetector.java
edu.eside.flingbox.math.Intersect.java
edu.eside.flingbox.math.Matrix22.java
edu.eside.flingbox.math.PolygonUtils.java
edu.eside.flingbox.math.Vector2D.java
edu.eside.flingbox.physics.PhysicAtomicBody.java
edu.eside.flingbox.physics.PhysicBody.java
edu.eside.flingbox.physics.PhysicPolygon.java
edu.eside.flingbox.physics.ScenePhysics.java
edu.eside.flingbox.physics.collisions.Arbiter.java
edu.eside.flingbox.physics.collisions.ColliderPolygon.java
edu.eside.flingbox.physics.collisions.Collider.java
edu.eside.flingbox.physics.collisions.ContactSolver.java
edu.eside.flingbox.physics.collisions.Contact.java
edu.eside.flingbox.physics.gravity.GravitySource.java
edu.eside.flingbox.scene.DrawingBody.java
edu.eside.flingbox.scene.DrawingPolygon.java
edu.eside.flingbox.scene.Scene.java
edu.eside.flingbox.utils.PositionComparator.java
edu.eside.flingbox.xml.InvalidXmlException.java
edu.eside.flingbox.xml.XmlExporter.java
edu.eside.flingbox.xml.XmlImporter.java