view src/samer/j3d/PatchArrayAlpha.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line source
package	samer.j3d;

import samer.core.types.*;
import samer.maths.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;


public class PatchArrayAlpha extends QuadArray implements Observer
{
	int			N;	// number of patches
	Matrix		P;	// positions and sizes of patches
	VVector		A;	// scalar activations
	VDouble		K;  // scaling factor for activations
	VDouble		L;  // scaling factor for sizes

	Color4f		carray[];	// array for holding colours

	public PatchArrayAlpha(Matrix points, VVector activities)
	{
		super(4*points.getRowDimension(), COORDINATES | COLOR_4);

		N=points.getRowDimension();
		P=points;
		A=activities;
		K=new VDouble("scale",1);
		L=new VDouble("patch.size",1);

		carray=new Color4f[4*N];
		for (int i=0; i<4*N; i+=4) 
			carray[i+3]=
				carray[i+2]=
				carray[i+1]=
				carray[i]=new Color4f(1f,1f,1f,1f);

		// set capabilities for subsequent updates
		setCapability(ALLOW_COORDINATE_WRITE);
		setCapability(ALLOW_COLOR_WRITE);

		updatePoints();
		updateActivities();

		A.addObserver(this);
		L.addObserver(new Observer () {
			public void update(Observable o, Object a) {
				updatePoints();
			}
		});
	}


	public void update(Observable o, Object a)
	{
		updateActivities();
	}

	private double quad[] = new double[12];

	public void updatePoints()
	{
		// load points into point array
		double [][] PA=P.getArray();
		double []	row;
		double		l=L.value;
		int			j=0;

		for (int i=0; i<N; i++) {
			row=PA[i];
			double x1=row[0]-l*row[1];
			double x2=row[0]+l*row[1];
			double y1=row[3]-l*row[4];
			double y2=row[3]+l*row[4];

			quad[0] = x1;	quad[1] = y1;	quad[2] = 0;
			quad[3] = x1;	quad[4] = y2;	quad[5] = 0;
			quad[6] = x2;	quad[7] = y2;	quad[8] = 0;
			quad[9] = x2;	quad[10]= y1;	quad[11]= 0;

			// set 4 vertices of quad
			setCoordinates(j,quad,0,4); j+=4;

			// choose color according to energy?
			// carray[i].set(Color.getHSBColor((float)(row[3]*0.3)+0.16f,1f,1f));
		}
	}

	public void updateActivities()
	{
		// load colours
		double []	a=A.array();
		double		k=K.value;
		int			j=0;

		for (int i=0; i<N; i++) {
			float ai=(float)(a[i]*k);
			carray[j].w = ai; j+=4;
		}
		setColors(0,carray);
	}
}