samer@0
|
1 package samer.j3d;
|
samer@0
|
2
|
samer@0
|
3 import samer.core.types.*;
|
samer@0
|
4 import samer.maths.*;
|
samer@0
|
5 import java.util.*;
|
samer@0
|
6 import javax.media.j3d.*;
|
samer@0
|
7 import javax.vecmath.*;
|
samer@0
|
8
|
samer@0
|
9
|
samer@0
|
10 public class PatchArrayAlpha extends QuadArray implements Observer
|
samer@0
|
11 {
|
samer@0
|
12 int N; // number of patches
|
samer@0
|
13 Matrix P; // positions and sizes of patches
|
samer@0
|
14 VVector A; // scalar activations
|
samer@0
|
15 VDouble K; // scaling factor for activations
|
samer@0
|
16 VDouble L; // scaling factor for sizes
|
samer@0
|
17
|
samer@0
|
18 Color4f carray[]; // array for holding colours
|
samer@0
|
19
|
samer@0
|
20 public PatchArrayAlpha(Matrix points, VVector activities)
|
samer@0
|
21 {
|
samer@0
|
22 super(4*points.getRowDimension(), COORDINATES | COLOR_4);
|
samer@0
|
23
|
samer@0
|
24 N=points.getRowDimension();
|
samer@0
|
25 P=points;
|
samer@0
|
26 A=activities;
|
samer@0
|
27 K=new VDouble("scale",1);
|
samer@0
|
28 L=new VDouble("patch.size",1);
|
samer@0
|
29
|
samer@0
|
30 carray=new Color4f[4*N];
|
samer@0
|
31 for (int i=0; i<4*N; i+=4)
|
samer@0
|
32 carray[i+3]=
|
samer@0
|
33 carray[i+2]=
|
samer@0
|
34 carray[i+1]=
|
samer@0
|
35 carray[i]=new Color4f(1f,1f,1f,1f);
|
samer@0
|
36
|
samer@0
|
37 // set capabilities for subsequent updates
|
samer@0
|
38 setCapability(ALLOW_COORDINATE_WRITE);
|
samer@0
|
39 setCapability(ALLOW_COLOR_WRITE);
|
samer@0
|
40
|
samer@0
|
41 updatePoints();
|
samer@0
|
42 updateActivities();
|
samer@0
|
43
|
samer@0
|
44 A.addObserver(this);
|
samer@0
|
45 L.addObserver(new Observer () {
|
samer@0
|
46 public void update(Observable o, Object a) {
|
samer@0
|
47 updatePoints();
|
samer@0
|
48 }
|
samer@0
|
49 });
|
samer@0
|
50 }
|
samer@0
|
51
|
samer@0
|
52
|
samer@0
|
53 public void update(Observable o, Object a)
|
samer@0
|
54 {
|
samer@0
|
55 updateActivities();
|
samer@0
|
56 }
|
samer@0
|
57
|
samer@0
|
58 private double quad[] = new double[12];
|
samer@0
|
59
|
samer@0
|
60 public void updatePoints()
|
samer@0
|
61 {
|
samer@0
|
62 // load points into point array
|
samer@0
|
63 double [][] PA=P.getArray();
|
samer@0
|
64 double [] row;
|
samer@0
|
65 double l=L.value;
|
samer@0
|
66 int j=0;
|
samer@0
|
67
|
samer@0
|
68 for (int i=0; i<N; i++) {
|
samer@0
|
69 row=PA[i];
|
samer@0
|
70 double x1=row[0]-l*row[1];
|
samer@0
|
71 double x2=row[0]+l*row[1];
|
samer@0
|
72 double y1=row[3]-l*row[4];
|
samer@0
|
73 double y2=row[3]+l*row[4];
|
samer@0
|
74
|
samer@0
|
75 quad[0] = x1; quad[1] = y1; quad[2] = 0;
|
samer@0
|
76 quad[3] = x1; quad[4] = y2; quad[5] = 0;
|
samer@0
|
77 quad[6] = x2; quad[7] = y2; quad[8] = 0;
|
samer@0
|
78 quad[9] = x2; quad[10]= y1; quad[11]= 0;
|
samer@0
|
79
|
samer@0
|
80 // set 4 vertices of quad
|
samer@0
|
81 setCoordinates(j,quad,0,4); j+=4;
|
samer@0
|
82
|
samer@0
|
83 // choose color according to energy?
|
samer@0
|
84 // carray[i].set(Color.getHSBColor((float)(row[3]*0.3)+0.16f,1f,1f));
|
samer@0
|
85 }
|
samer@0
|
86 }
|
samer@0
|
87
|
samer@0
|
88 public void updateActivities()
|
samer@0
|
89 {
|
samer@0
|
90 // load colours
|
samer@0
|
91 double [] a=A.array();
|
samer@0
|
92 double k=K.value;
|
samer@0
|
93 int j=0;
|
samer@0
|
94
|
samer@0
|
95 for (int i=0; i<N; i++) {
|
samer@0
|
96 float ai=(float)(a[i]*k);
|
samer@0
|
97 carray[j].w = ai; j+=4;
|
samer@0
|
98 }
|
samer@0
|
99 setColors(0,carray);
|
samer@0
|
100 }
|
samer@0
|
101 }
|
samer@0
|
102
|