Displaying multiple boxes

Started by gamerfan, September 08, 2011, 03:06:59 PM

Previous topic - Next topic

EgonOlsen

It removes data from Object3D and Mesh and isn't needed anymore once the object has been uploaded to the GPU. It might be needed in the VertexController though, which might be a reason why it fails.

gamerfan

I have modified  the code like this:

public boolean onKeyDown(int keyCode, KeyEvent msg) {
          if( keyCode == KeyEvent.KEYCODE_A ) {
              System.out.println(" total angle swept " + box.getTransformedCenter().calcAngle(box.getXAxis()) );
              VertexController vc = new VertexController(box);
              box.getMesh().setVertexController(vc, IVertexController.PRESERVE_SOURCE_MESH);
              //vc.setScale(box.getTransformedCenter());
              //vc.apply();
              xDelta+=1.5f;
              return true;
          }
         return true;
        }
===============
  class VertexController extends GenericVertexController {

        public VertexController( Object3D toCheck ) {
      super.init(toCheck.getMesh(), true);
        }
       
        public void apply() {
            SimpleVector[] vertices   = getSourceMesh();
    SimpleVector[] destination = getDestinationMesh();
            for (int i = 0; i < vertices.length; i++){
    //vertices[i].x *= scale.x;
            // System.out.println(" scale.x " + scale.x);
             vertices[i].x *= vertices[i].x * 5;
     //vertices[i].y *= vertices[i].y * 3;
    //vertices[i].z *= scale.z * 5;

    destination[i].x = vertices[i].x;
   // destination[i].y = vertices[i].y;
    //destination[i].z = vertices[i].z;
    }
    this.updateMesh();
        }

I moved the logic inside the apply method as you told.But I am getting the following error:
09-20 14:52:37.761: ERROR/AndroidRuntime(1188): java.lang.RuntimeException: [ 1316510557744 ] - ERROR: This instance has already been assigned to another Mesh!

EgonOlsen

The error says it all:

QuoteERROR: This instance has already been assigned to another Mesh!

Each mesh needs it's own instance of your controller.

gamerfan

I resolved this error by commenting the constructor call in the VertexController.This is the modified code.

      class VertexController extends GenericVertexController {

        public VertexController( Object3D toCheck ) {
     // super.init(toCheck.getMesh(), true);
        }
        public void apply() {
            SimpleVector[] vertices   = getSourceMesh();
    SimpleVector[] destination = getDestinationMesh();
            for (int i = 0; i < vertices.length; i++){
             vertices[i].x *= vertices[i].x * 5;
     destination[i].x = vertices[i].x;
    }
   //this.updateMesh();
        }
      }
===================
        public boolean onKeyDown(int keyCode, KeyEvent msg) {
          if( keyCode == KeyEvent.KEYCODE_A ) {
              System.out.println(" total angle swept " + box.getTransformedCenter().calcAngle(box.getXAxis()) );
              //world.removeObject(box);
              //box = createBox(xDelta, 0.75f);
              //box.setAdditionalColor(RGBColor.WHITE);
              //box.translate(-10, 10, 0);
              //world.addObject( box );
              //world.buildAllObjects();
              VertexController vc = new VertexController(box);
              Mesh mesh = box.getMesh();
              mesh.setVertexController(vc, true);
              mesh.applyVertexController();
              xDelta+=1.5f;
              return true;
          }
         return true;
        }


After making these changes , I am able to run the application. But when  I press the A key, the box size is not increasing on x-axis.Is there anything I missed here?

EgonOlsen

Well, what do you expect? You have removed the call to super() in the constructor, which means that the abstract base class isn't initiliazed properly. Just do what i posted before: Assign a new instance of your controller to each mesh that needs it. Don't try to reuse the same instance over and over again as this doesn't work (hence the error message).

gamerfan

still the same error persists.In the code, I am creating new instances of VertexController every time.I have modified the code also.

@Override
        public boolean onKeyDown(int keyCode, KeyEvent msg) {
          if( keyCode == KeyEvent.KEYCODE_A ) {
              System.out.println(" total angle swept " + box.getTransformedCenter().calcAngle(box.getXAxis()) );
              Mesh mesh = box.getMesh();
              VertexController vc = new VertexController(mesh);
              mesh.setVertexController(vc,true);
              mesh.applyVertexController();
              xDelta+=1.5f;
              return true;
          }
         return true;
        }

Not able to figure it out. Do I need to make the box object itself local

EgonOlsen

My bad...to a degree... ;) Remove the call to super.init() from your constructor. It's not your code's task to initialize the controller, the engine does this. I must have been confused when writing that it's needed, sorry.

gamerfan

That is ok ...@EgonOlsen.No probs.. ;D.
But even if I commented that line , what happens is that the box size is not getting affected on x-axis when I press some key.Can I extend a box on its x-axis so that the box slowly turns to be a 3d rectangle?

EgonOlsen

Can you post the whole thing, so that i can have a look at it?

gamerfan

Sure. I am pasting the code here.What it does is when you move mouse left or righ , the shapes on the screen rotates.The red color box is the candidate here.This one is not getting stretched on x-axis when I press 'A' key on keyboard.


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org.me.home;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import com.threed.jpct.Camera;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.GenericVertexController;
import com.threed.jpct.IVertexController;
import com.threed.jpct.Light;
import com.threed.jpct.Logger;
import com.threed.jpct.Mesh;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.RGBColor;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.World;
import com.threed.jpct.util.MemoryHelper;
import java.lang.reflect.Field;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.opengles.GL10;

/**
*
* @author Unni Vemanchery Mana
*/

public class MainActivity extends Activity {

// Used to handle pause and resume...
private static MainActivity master = null;

private GLSurfaceView mGLView;
private MyRenderer renderer = null;
private FrameBuffer fb = null;
private World world = null;
private RGBColor back = new RGBColor(50, 50, 100);

private float touchTurn = 0;
private float touchTurnUp = 0;

private float xpos = -1;
private float ypos = -1;

private Object3D cube = null;
        private Object3D box = null;
        private Object3D newbox = null;
        private Object3D line3d = null;

       
private int fps = 0;

private Light sun = null;

        private float xDelta = 1.5f;
        private float yDelta = 0;
        private float zDelta = 0;
        private int counter = 0;
       
    @Override
protected void onCreate(Bundle savedInstanceState) {

Logger.log("onCreate");

if (master != null) {
copy(master);
}

super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(getApplication());

mGLView.setEGLConfigChooser(new GLSurfaceView.EGLConfigChooser() {
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
// Ensure that we get a 16bit framebuffer. Otherwise, we'll fall
// back to Pixelflinger on some device (read: Samsung I7500)
int[] attributes = new int[] { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE };
EGLConfig[] configs = new EGLConfig[1];
int[] result = new int[1];
egl.eglChooseConfig(display, attributes, configs, 1, result);
return configs[0];
}
});

renderer = new MyRenderer();
mGLView.setRenderer(renderer);
setContentView(mGLView);
}

@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}

@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}

@Override
protected void onStop() {
super.onStop();
}

private void copy(Object src) {
try {
Logger.log("Copying data from master Activity!");
Field[] fs = src.getClass().getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true);
f.set(this, f.get(src));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

    @Override
public boolean onTouchEvent(MotionEvent me) {

if (me.getAction() == MotionEvent.ACTION_DOWN) {
xpos = me.getX();
ypos = me.getY();
return true;
}

if (me.getAction() == MotionEvent.ACTION_UP) {
xpos = -1;
ypos = -1;
touchTurn = 0;
touchTurnUp = 0;
return true;
}

if (me.getAction() == MotionEvent.ACTION_MOVE) {
float xd = me.getX() - xpos;
float yd = me.getY() - ypos;

xpos = me.getX();
ypos = me.getY();

touchTurn = xd / -100f;
touchTurnUp = yd / -100f;
return true;
}

try {
Thread.sleep(15);
} catch (Exception e) {
// No need for this...
}

return super.onTouchEvent(me);
}

    @Override
        public boolean onKeyDown(int keyCode, KeyEvent msg) {
          if( keyCode == KeyEvent.KEYCODE_A ) {
              System.out.println(" total angle swept " + box.getTransformedCenter().calcAngle(box.getXAxis()) );
              Mesh mesh = box.getMesh();
              VertexController vc = new VertexController(mesh);
              mesh.setVertexController(vc,true);
              mesh.applyVertexController();
              xDelta+=1.5f;
              return true;
          }
         return true;
        }
     


private Object3D createLine (SimpleVector pointA, SimpleVector pointB, float width, String textureName)
{
    Object3D line = new Object3D( 8 );
    float offset = width / 2.0f;
    // Quad A:
    line.addTriangle( new SimpleVector( pointA.x, pointA.y - offset, pointA.z ), 0, 0,
                     new SimpleVector( pointA.x, pointA.y + offset, pointA.z ), 0, 1,
                     new SimpleVector( pointB.x, pointB.y + offset, pointB.z ), 1, 1
                     );
    line.addTriangle( new SimpleVector( pointB.x, pointB.y + offset, pointB.z ), 0, 0,
                     new SimpleVector( pointB.x, pointB.y - offset, pointB.z ), 0, 1,
                     new SimpleVector( pointA.x, pointA.y - offset, pointA.z ), 1, 1
                     );
    // Quad A, back-face:
    line.addTriangle( new SimpleVector( pointB.x, pointB.y - offset, pointB.z ), 0, 0,
                     new SimpleVector( pointB.x, pointB.y + offset, pointB.z ), 0, 1,
                     new SimpleVector( pointA.x, pointA.y + offset, pointA.z ), 1, 1
                     );
    line.addTriangle( new SimpleVector( pointA.x, pointA.y + offset, pointA.z ), 0, 0,
                     new SimpleVector( pointA.x, pointA.y - offset, pointA.z ), 0, 1,
                     new SimpleVector( pointB.x, pointB.y - offset, pointB.z ), 1, 1
                     );
    // Quad B:
    line.addTriangle( new SimpleVector( pointA.x, pointA.y, pointA.z + offset ), 0, 0,
                     new SimpleVector( pointA.x, pointA.y, pointA.z - offset ), 0, 1,
                     new SimpleVector( pointB.x, pointB.y, pointB.z - offset ), 1, 1
                     );
    line.addTriangle( new SimpleVector( pointB.x, pointB.y, pointB.z - offset ), 0, 0,
                     new SimpleVector( pointB.x, pointB.y, pointB.z + offset ), 0, 1,
                     new SimpleVector( pointA.x, pointA.y, pointA.z + offset ), 1, 1
                     );

    // Quad B, back-face:
    line.addTriangle( new SimpleVector( pointB.x, pointB.y, pointB.z + offset ), 0, 0,
                     new SimpleVector( pointB.x, pointB.y, pointB.z - offset ), 0, 1,
                     new SimpleVector( pointA.x, pointA.y, pointA.z - offset ), 1, 1
                     );
    line.addTriangle( new SimpleVector( pointA.x, pointA.y, pointA.z - offset ), 0, 0,
                     new SimpleVector( pointA.x, pointA.y, pointA.z + offset ), 0, 1,
                     new SimpleVector( pointB.x, pointB.y, pointB.z + offset ), 1, 1
                     );
 

    // If you don't want the line to react to lighting:
    line.setLighting( Object3D.LIGHTING_NO_LIGHTS );
    line.setAdditionalColor( RGBColor.WHITE );

    // done
    return line;
}

protected boolean isFullscreenOpaque() {
return true;
}

class MyRenderer implements GLSurfaceView.Renderer {

private long time = System.currentTimeMillis();

public MyRenderer() {
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
if (fb != null) {
fb.dispose();
}
fb = new FrameBuffer(gl, w, h);

if (master == null) {

world = new World();
world.setAmbientLight(20, 20, 20);

sun = new Light(world);
sun.setIntensity(250, 250, 250);

// Create a texture out of the icon...:-)
//Texture texture = new Texture(BitmapHelper.rescale(BitmapHelper.convert(getResources().getDrawable(R.drawable.icon)), 64, 64));
//TextureManager.getInstance().addTexture("texture", texture);

cube = Primitives.getCube(1);
//cube.calcTextureWrapSpherical();
//cube.setTexture("texture");
//cube.strip();
//cube.build();

                                box = Primitives.getBox(1.5f, 0.75f);
                                box.setAdditionalColor(RGBColor.RED);
                              //  box.setTransparency(0);

                                box.translate(-10, 10, 0);
                                box.translateMesh();
                              //  box.strip();
                                System.out.println(" first box center "+ box.getOrigin());

                                // adding one more cube
                                newbox = Primitives.getBox(1.5f, 0.70f);
                                newbox.setAdditionalColor(RGBColor.RED);
                               // newbox.setTransparency(0);
                                newbox.translate((-10.0f + 1.0f), 10.0f, -1.0f);
                                newbox.translateMesh();
                                newbox.strip();


world.addObject(cube);
                                world.addObject(box);
                                world.addObject(newbox);


                                line3d = createLine(new SimpleVector(5,0,0), new SimpleVector(5,10,0), 2, "");
                                line3d.translate(5, 0, 0);
                                line3d.translateMesh();

                                world.addObject(line3d);

Camera cam = world.getCamera();
cam.moveCamera(Camera.CAMERA_MOVEOUT, 50);
cam.lookAt(cube.getTransformedCenter());

SimpleVector sv = new SimpleVector();
sv.set(cube.getTransformedCenter());
sv.y -= 100;
sv.z -= 100;
sun.setPosition(sv);
MemoryHelper.compact();

if (master == null) {
Logger.log("Saving master Activity!");
master = MainActivity.this;
}
}
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}

public void onDrawFrame(GL10 gl) {
if (touchTurn != 0) {
    cube.rotateY(touchTurn);
                            box.rotateY(touchTurn) ;
                            line3d.rotateY(touchTurn);
    touchTurn = 0;
                            yDelta +=0.02f;
}

if (touchTurnUp != 0) {
    cube.rotateX( touchTurnUp );
    touchTurnUp = 0;
}

fb.clear(back);
world.renderScene(fb);
world.draw(fb);
fb.display();

if (System.currentTimeMillis() - time >= 1000) {
//Logger.log(fps + "fps");
fps = 0;
time = System.currentTimeMillis();
}
fps++;
}
}

      class VertexController extends GenericVertexController {

        public VertexController( Mesh toCheck ) {
   //  super.init(toCheck, true);
        }
        public void apply() {
            SimpleVector[] vertices = getSourceMesh();
    SimpleVector[] destination = getDestinationMesh();
            for (int i = 0; i < vertices.length; i++){
                System.out.println("before vertices[i].x "+vertices[i].x);
             //vertices[i].x *= vertices[i].x * 5;
             System.out.println("after vertices[i].x "+vertices[i].x);
     destination[i].x+=destination[i].x + xDelta;
    }
   this.updateMesh();
        }
      }

}


EgonOlsen

This one works better:


package com.threed.jpct.scaletest;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import com.threed.jpct.Camera;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.GenericVertexController;
import com.threed.jpct.Light;
import com.threed.jpct.Logger;
import com.threed.jpct.Mesh;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.RGBColor;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.World;
import com.threed.jpct.util.MemoryHelper;
import java.lang.reflect.Field;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.opengles.GL10;

/**
*
* @author Unni Vemanchery Mana
*/

public class ScaleTest extends Activity {

// Used to handle pause and resume...
private static ScaleTest master = null;

private GLSurfaceView mGLView;
private MyRenderer renderer = null;
private FrameBuffer fb = null;
private World world = null;
private RGBColor back = new RGBColor(50, 50, 100);

private float touchTurn = 0;
private float touchTurnUp = 0;

private float xpos = -1;
private float ypos = -1;

private Object3D cube = null;
private Object3D box = null;
private Object3D newbox = null;
private Object3D line3d = null;

private int fps = 0;

private Light sun = null;

private float xDelta = 0.1f;
private float yDelta = 0;
private float zDelta = 0;
private int counter = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {

Logger.log("onCreate");

if (master != null) {
copy(master);
}

super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(getApplication());

mGLView.setEGLConfigChooser(new GLSurfaceView.EGLConfigChooser() {
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
// Ensure that we get a 16bit framebuffer. Otherwise, we'll fall
// back to Pixelflinger on some device (read: Samsung I7500)
int[] attributes = new int[] { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE };
EGLConfig[] configs = new EGLConfig[1];
int[] result = new int[1];
egl.eglChooseConfig(display, attributes, configs, 1, result);
return configs[0];
}
});

renderer = new MyRenderer();
mGLView.setRenderer(renderer);
setContentView(mGLView);
}

@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}

@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}

@Override
protected void onStop() {
super.onStop();
}

private void copy(Object src) {
try {
Logger.log("Copying data from master Activity!");
Field[] fs = src.getClass().getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true);
f.set(this, f.get(src));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

@Override
public boolean onTouchEvent(MotionEvent me) {

if (me.getAction() == MotionEvent.ACTION_DOWN) {
xpos = me.getX();
ypos = me.getY();
return true;
}

if (me.getAction() == MotionEvent.ACTION_UP) {
xpos = -1;
ypos = -1;
touchTurn = 0;
touchTurnUp = 0;
return true;
}

if (me.getAction() == MotionEvent.ACTION_MOVE) {
float xd = me.getX() - xpos;
float yd = me.getY() - ypos;

xpos = me.getX();
ypos = me.getY();

touchTurn = xd / -100f;
touchTurnUp = yd / -100f;
return true;
}

try {
Thread.sleep(15);
} catch (Exception e) {
// No need for this...
}

return super.onTouchEvent(me);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
if (keyCode == KeyEvent.KEYCODE_A) {
System.out.println(" total angle swept " + box.getTransformedCenter().calcAngle(box.getXAxis()));
Mesh mesh = box.getMesh();
mesh.applyVertexController();
box.touch();
xDelta += 0.1f;
return true;
}
return true;
}

private Object3D createLine(SimpleVector pointA, SimpleVector pointB, float width, String textureName) {
Object3D line = new Object3D(8);
float offset = width / 2.0f;
// Quad A:
line.addTriangle(new SimpleVector(pointA.x, pointA.y - offset, pointA.z), 0, 0, new SimpleVector(pointA.x, pointA.y + offset, pointA.z), 0, 1, new SimpleVector(pointB.x,
pointB.y + offset, pointB.z), 1, 1);
line.addTriangle(new SimpleVector(pointB.x, pointB.y + offset, pointB.z), 0, 0, new SimpleVector(pointB.x, pointB.y - offset, pointB.z), 0, 1, new SimpleVector(pointA.x,
pointA.y - offset, pointA.z), 1, 1);
// Quad A, back-face:
line.addTriangle(new SimpleVector(pointB.x, pointB.y - offset, pointB.z), 0, 0, new SimpleVector(pointB.x, pointB.y + offset, pointB.z), 0, 1, new SimpleVector(pointA.x,
pointA.y + offset, pointA.z), 1, 1);
line.addTriangle(new SimpleVector(pointA.x, pointA.y + offset, pointA.z), 0, 0, new SimpleVector(pointA.x, pointA.y - offset, pointA.z), 0, 1, new SimpleVector(pointB.x,
pointB.y - offset, pointB.z), 1, 1);
// Quad B:
line.addTriangle(new SimpleVector(pointA.x, pointA.y, pointA.z + offset), 0, 0, new SimpleVector(pointA.x, pointA.y, pointA.z - offset), 0, 1, new SimpleVector(pointB.x,
pointB.y, pointB.z - offset), 1, 1);
line.addTriangle(new SimpleVector(pointB.x, pointB.y, pointB.z - offset), 0, 0, new SimpleVector(pointB.x, pointB.y, pointB.z + offset), 0, 1, new SimpleVector(pointA.x,
pointA.y, pointA.z + offset), 1, 1);

// Quad B, back-face:
line.addTriangle(new SimpleVector(pointB.x, pointB.y, pointB.z + offset), 0, 0, new SimpleVector(pointB.x, pointB.y, pointB.z - offset), 0, 1, new SimpleVector(pointA.x,
pointA.y, pointA.z - offset), 1, 1);
line.addTriangle(new SimpleVector(pointA.x, pointA.y, pointA.z - offset), 0, 0, new SimpleVector(pointA.x, pointA.y, pointA.z + offset), 0, 1, new SimpleVector(pointB.x,
pointB.y, pointB.z + offset), 1, 1);

// If you don't want the line to react to lighting:
line.setLighting(Object3D.LIGHTING_NO_LIGHTS);
line.setAdditionalColor(RGBColor.WHITE);

// done
return line;
}

protected boolean isFullscreenOpaque() {
return true;
}

class MyRenderer implements GLSurfaceView.Renderer {

private long time = System.currentTimeMillis();

public MyRenderer() {
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
if (fb != null) {
fb.dispose();
}
fb = new FrameBuffer(gl, w, h);

if (master == null) {

world = new World();
world.setAmbientLight(20, 20, 20);

sun = new Light(world);
sun.setIntensity(250, 250, 250);

// Create a texture out of the icon...:-)
// Texture texture = new
// Texture(BitmapHelper.rescale(BitmapHelper.convert(getResources().getDrawable(R.drawable.icon)),
// 64, 64));
// TextureManager.getInstance().addTexture("texture", texture);

cube = Primitives.getCube(1);
// cube.calcTextureWrapSpherical();
// cube.setTexture("texture");
// cube.strip();
// cube.build();

box = Primitives.getBox(1.5f, 0.75f);
box.setAdditionalColor(RGBColor.RED);
// box.setTransparency(0);

box.translate(-10, 10, 0);
box.calcNormals();
VertexController vc = new VertexController();
box.getMesh().setVertexController(vc, false);

// adding one more cube
newbox = Primitives.getBox(1.5f, 0.70f);
newbox.setAdditionalColor(RGBColor.RED);
// newbox.setTransparency(0);
newbox.translate((-10.0f + 1.0f), 10.0f, -1.0f);
newbox.strip();

world.addObject(cube);
world.addObject(box);
world.addObject(newbox);

line3d = createLine(new SimpleVector(5, 0, 0), new SimpleVector(5, 10, 0), 2, "");
line3d.translate(5, 0, 0);

world.addObject(line3d);

Camera cam = world.getCamera();
cam.moveCamera(Camera.CAMERA_MOVEOUT, 50);
cam.lookAt(cube.getTransformedCenter());

SimpleVector sv = new SimpleVector();
sv.set(cube.getTransformedCenter());
sv.y -= 100;
sv.z -= 100;
sun.setPosition(sv);
MemoryHelper.compact();

if (master == null) {
Logger.log("Saving master Activity!");
master = ScaleTest.this;
}
}
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}

public void onDrawFrame(GL10 gl) {
if (touchTurn != 0) {
cube.rotateY(touchTurn);
box.rotateY(touchTurn);
line3d.rotateY(touchTurn);
touchTurn = 0;
yDelta += 0.02f;
}

if (touchTurnUp != 0) {
cube.rotateX(touchTurnUp);
touchTurnUp = 0;
}

fb.clear(back);
world.renderScene(fb);
world.draw(fb);
fb.display();

if (System.currentTimeMillis() - time >= 1000) {
// Logger.log(fps + "fps");
fps = 0;
time = System.currentTimeMillis();
}
fps++;
}
}

class VertexController extends GenericVertexController {

private static final long serialVersionUID = 1L;

public VertexController() {
}

public void apply() {
SimpleVector[] source = getSourceMesh();
SimpleVector[] destination = getDestinationMesh();

SimpleVector[] sourceNormals = getSourceNormals();
SimpleVector[] destinationNormals = getDestinationNormals();

for (int i = 0; i < source.length; i++) {
destination[i].x += source[i].x + xDelta;
destinationNormals[i].set(sourceNormals[i]);
}
}
}

}


I had to modify some stuff...not sure if i remember everything, but i'll try:


  • The controller updated the destination mesh with the destination mesh. That made no sense. It should rather copy and modify the data from source into destination.
  • The controller called updateMesh() itself. No need to do this. The docs also mention this.
  • The controller was created for each click on A...that's a waste of time and memory. Create one controller for the box at startup and only call apply...instead.
  • The box was created without knowledge that the controller can change it later (because it wasn't present at build-time). jPCT-AE can't determine that the object isn't static in this case. So you either have to call compile(true, false); on it yourself, or add the controller before the object will be build (you are omitting the call to build(), which is why it happens at first render).
  • The controller was created with modify=true. I don't think that that was what you had in mind. I changed it to false to preserve the source mesh.
  • After each translate(....), you called translateMesh(). Again, i don't think that you intended this. It makes the translation permanent to the mesh data itself. For normal translations, it's no needed. I've removed these calls.
  • Last but not least, you have to call touch() on the object after applying the controller, because otherwise, the object doesn't know that it has to update itself on the GPU.

Hope this helps.

AGP

Hey, I wrote it so that the scaling class would need no knowledge about the VertexController (you'd initialize a VC with your Object3D then just have it scale in a total of two lines). Plus, some of that redundancy must have been needed at some point. And in my defense, the docs used to be a LOT less complete. :- )

gamerfan

@EgonOlsen. Thanks.It really helped. :).I know my level of understanding is very little here.Now it works.

gamerfan

One more quick clarification here.When  I press A key, it stretches its both vertices diagonally.Is this the expected behaviour or can I pull along it on only x-axis? Is there any other standard algorithms I have to use for this?

EgonOlsen

I'm not sure if i understand the question correctly, but if i do, i would say that this is caused by either the camera's or the box's rotation. If the object is aligned to the x-axis and viewed from straight down the z-axis, it will only extends in x-direction in camera space.