331 lines
10 KiB
Java
331 lines
10 KiB
Java
|
// класс содержащий модель - массив групп и источников света
|
||
|
|
||
|
import java.util.Vector;
|
||
|
import javax.microedition.lcdui.Graphics;
|
||
|
|
||
|
public class Model
|
||
|
{
|
||
|
Vector g;
|
||
|
|
||
|
Vector l; // освещение
|
||
|
|
||
|
public Model()
|
||
|
{
|
||
|
g = new Vector();
|
||
|
|
||
|
l=new Vector();
|
||
|
}
|
||
|
|
||
|
public void draw(Graphics gr, Matrix3D m) {
|
||
|
if(l!=null&&!l.isEmpty()){for(int i=0;i<l.size();i++){if(l.elementAt(i)!=null)((Light)l.elementAt(i)).setMatrix(m);}}
|
||
|
if (g.isEmpty()) return;
|
||
|
/* for (int i = 0; i < v.size(); i++) {
|
||
|
Vertex vx = (Vertex)v.elementAt(i);
|
||
|
vx.setMatrix(m);
|
||
|
}*/
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
((Group)g.elementAt(i)).draw(gr, m,l);}
|
||
|
}
|
||
|
public void render(int[] r,int[] z,Matrix3D m,int shad,int view){
|
||
|
if(l!=null&&!l.isEmpty()){for(int i=0;i<l.size();i++){if(l.elementAt(i)!=null)((Light)l.elementAt(i)).setMatrix(m);}}
|
||
|
if (g.isEmpty()) return;
|
||
|
// if(z==null){
|
||
|
/* for (int i = 0; i < v.size(); i++) {
|
||
|
Vertex vx = (Vertex)v.elementAt(i);
|
||
|
vx.setMatrix(m);
|
||
|
}
|
||
|
// Ksort.sort(f);}*/
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
((Group)g.elementAt(i)).render(r, z, m,l,shad,view);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void add(Face[] t,String name) {
|
||
|
if (t==null) return;
|
||
|
if(t.length < 1)return;
|
||
|
Group gr=new Group(t,name,g.size());
|
||
|
g.addElement(gr);
|
||
|
}
|
||
|
|
||
|
public void add(Group gr){
|
||
|
if(gr==null)return;
|
||
|
if(gr.v==null||gr.f==null)return;
|
||
|
if(gr.v.size()<1||gr.f.size()<1)return;
|
||
|
g.addElement(gr);
|
||
|
}
|
||
|
|
||
|
public Group getLast(){
|
||
|
return (Group)g.lastElement();
|
||
|
}
|
||
|
|
||
|
public Vector select(int sx,int sy,int x,int y,Matrix3D m){ // возвращает объекты, попадающие в рамку выделения
|
||
|
if(sx>x){
|
||
|
int tmp=sx;
|
||
|
sx=x;
|
||
|
x=tmp;
|
||
|
}
|
||
|
if(sy>y){
|
||
|
int tmp=sy;
|
||
|
sy=y;
|
||
|
y=tmp;
|
||
|
}
|
||
|
Vector p=new Vector();
|
||
|
if(l!=null)for(int i=0;i<l.size();i++){
|
||
|
Light z=(Light)l.elementAt(i);
|
||
|
if(((z.sx-10>=sx&&z.sx-10<=x)||(z.sx+10>=sx&&z.sx+10<=x)||(z.sx-10<=sx&&z.sx+10>=x))&&((z.sy-10>=sy&&z.sy-10<=y)||(z.sy+10>=sy&&z.sy+10<=y)||(z.sy-10<=sy&&z.sy+10>=y)))p.addElement(z);
|
||
|
}
|
||
|
int[] b;
|
||
|
if(g!=null)for (int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
b=gr.getBounce(m);
|
||
|
if(((b[0]>=sx&&b[0]<=x)||(b[2]>=sx&&b[2]<=x)||(b[0]<=sx&&b[2]>=x))&&((b[1]>=sy&&b[1]<=y)||(b[3]>=sy&&b[3]<=y)||(b[1]<=sy&&b[3]>=y)))p.addElement(gr);
|
||
|
}
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
public Vector selectTr(int sx,int sy,int x,int y){ // треугольники
|
||
|
if(sx>x){
|
||
|
int tmp=sx;
|
||
|
sx=x;
|
||
|
x=tmp;
|
||
|
}
|
||
|
if(sy>y){
|
||
|
int tmp=sy;
|
||
|
sy=y;
|
||
|
y=tmp;
|
||
|
}
|
||
|
Vector p=new Vector();
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.f.size();j++){
|
||
|
Triangle tr=(Triangle)gr.f.elementAt(j);
|
||
|
if((tr.a.sx<=x&&tr.a.sx>=sx&&tr.a.sy<=y&&tr.a.sy>=sy)||(tr.b.sx<=x&&tr.b.sx>=sx&&tr.b.sy<=y&&tr.b.sy>=sy)||(tr.c.sx<=x&&tr.c.sx>=sx&&tr.c.sy<=y&&tr.c.sy>=sy)) p.addElement(tr);
|
||
|
}
|
||
|
}
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
public Vector selectVer(int sx,int sy,int x,int y){ // вершины
|
||
|
if(sx>x){
|
||
|
int tmp=sx;
|
||
|
sx=x;
|
||
|
x=tmp;
|
||
|
}
|
||
|
if(sy>y){
|
||
|
int tmp=sy;
|
||
|
sy=y;
|
||
|
y=tmp;
|
||
|
}
|
||
|
Vector p=new Vector();
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.v.size();j++){
|
||
|
Vertex ver=(Vertex)gr.v.elementAt(j);
|
||
|
if(ver.sx>=sx&&ver.sx<=x&&ver.sy>=sy&&ver.sy<=y)p.addElement(ver);
|
||
|
}
|
||
|
}
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
public Vector select3d(int[] s,Matrix3D m){ // объекты, попавшие в трехмерное выделение
|
||
|
if(s[0]>s[3]){
|
||
|
int tmp=s[0];
|
||
|
s[0]=s[3];
|
||
|
s[3]=tmp;
|
||
|
}
|
||
|
if(s[1]>s[4]){
|
||
|
int tmp=s[1];
|
||
|
s[1]=s[4];
|
||
|
s[4]=tmp;
|
||
|
}
|
||
|
if(s[2]>s[5]){
|
||
|
int tmp=s[2];
|
||
|
s[2]=s[5];
|
||
|
s[5]=tmp;
|
||
|
}
|
||
|
Vector p=new Vector();
|
||
|
if(l!=null)for (int i=0;i<l.size();i++){
|
||
|
Light z=(Light)l.elementAt(i);
|
||
|
if(z.x>=s[0]&&z.x<=s[3]&&z.y>=s[1]&&z.y<=s[4]&&z.z>=s[2]&&z.z<=s[5])p.addElement(z);
|
||
|
}
|
||
|
int[] b;
|
||
|
if(g!=null)for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
b=gr.getVolumeBounce(m);
|
||
|
if(((b[0]>=s[0]&&b[0]<=s[3])||(b[3]>=s[0]&&b[3]<=s[3])||(b[0]<=s[0]&&b[3]>=s[3]))&&((b[1]>=s[1]&&b[1]<=s[4])||(b[4]>=s[1]&&b[4]<=s[4])||(b[1]<=s[1]&&b[4]>=s[4]))&&((b[2]>=s[2]&&b[2]<=s[5])||(b[5]>=s[2]&&b[5]<=s[5])||(b[2]<=s[2]&&b[5]>=s[5]))) p.addElement(gr);
|
||
|
}
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
public Vector select3dTr(int[] s){
|
||
|
if(s[0]>s[3]){
|
||
|
int tmp=s[0];
|
||
|
s[0]=s[3];
|
||
|
s[3]=tmp;
|
||
|
}
|
||
|
if(s[1]>s[4]){
|
||
|
int tmp=s[1];
|
||
|
s[1]=s[4];
|
||
|
s[4]=tmp;
|
||
|
}
|
||
|
if(s[2]>s[5]){
|
||
|
int tmp=s[2];
|
||
|
s[2]=s[5];
|
||
|
s[5]=tmp;
|
||
|
}
|
||
|
Vector p=new Vector();
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.f.size();j++){
|
||
|
Triangle tr=(Triangle)gr.f.elementAt(j);
|
||
|
if((tr.a.x<=s[3]&&tr.a.x>=s[0]&&tr.a.y<=s[4]&&tr.a.y>=s[1]&&tr.a.z<=s[5]&&tr.a.z>=s[2])||(tr.b.x<=s[3]&&tr.b.x>=s[0]&&tr.b.y<=s[4]&&tr.b.y>=s[1]&&tr.b.z<=s[5]&&tr.b.z>=s[2])||(tr.c.x<=s[3]&&tr.c.x>=s[0]&&tr.c.y<=s[4]&&tr.c.y>=s[1]&&tr.c.z<=s[5]&&tr.c.z>=s[2])) p.addElement(tr);
|
||
|
}
|
||
|
}
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
public Vector select3dVer(int[] s){
|
||
|
if(s[0]>s[3]){
|
||
|
int tmp=s[0];
|
||
|
s[0]=s[3];
|
||
|
s[3]=tmp;
|
||
|
}
|
||
|
if(s[1]>s[4]){
|
||
|
int tmp=s[1];
|
||
|
s[1]=s[4];
|
||
|
s[4]=tmp;
|
||
|
}
|
||
|
if(s[2]>s[5]){
|
||
|
int tmp=s[2];
|
||
|
s[2]=s[5];
|
||
|
s[5]=tmp;
|
||
|
}
|
||
|
Vector p=new Vector();
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.v.size();j++){
|
||
|
Vertex ver=(Vertex)gr.v.elementAt(j);
|
||
|
if(ver.x>=s[0]&&ver.x<=s[3]&&ver.y>=s[1]&&ver.y<=s[4]&&ver.z>=s[2]&&ver.z<=s[5])p.addElement(ver);
|
||
|
}
|
||
|
}
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
public Object pick(int x,int y,Matrix3D m){ // ближайший объект на месте щелчка курсором
|
||
|
int[] b;
|
||
|
int max=Integer.MAX_VALUE;
|
||
|
Object ret=null;
|
||
|
if(l!=null)for(int i=0;i<l.size();i++){
|
||
|
Light li=(Light)l.elementAt(i);
|
||
|
if(li.zc<=max&&x>=li.sx-10&&x<=li.sx+10&&y>=li.sy-10&&y<=li.sy+10&&li.zc>=(-Vertex.dist+1)){max=li.zc;ret=li;}
|
||
|
}
|
||
|
if(g!=null)for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
b=gr.getBounce(m);
|
||
|
if(b[4]<=max&&x>=b[0]&&x<=b[2]&&y>=b[1]&&y<=b[3]&&b[4]>=(-Vertex.dist+1)){max=b[4];ret=gr;}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
public Triangle pickTr(int x,int y,Matrix3D m){
|
||
|
int minz=Integer.MAX_VALUE;
|
||
|
Triangle ret=null;
|
||
|
for (int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.f.size();j++){
|
||
|
Triangle tr=(Triangle)gr.f.elementAt(j);
|
||
|
tr.setVertexMatrix(m);
|
||
|
int ai=(tr.a.sx - x) * (tr.b.sy - tr.a.sy) - (tr.b.sx - tr.a.sx) * (tr.a.sy - y);
|
||
|
int bi=(tr.b.sx - x) * (tr.c.sy - tr.b.sy) - (tr.c.sx - tr.b.sx) * (tr.b.sy - y);
|
||
|
int ci=(tr.c.sx - x) * (tr.a.sy - tr.c.sy) - (tr.a.sx - tr.c.sx) * (tr.c.sy - y);
|
||
|
if(((ai>=0&&bi>=0&&ci>=0)||(ai<=0&&bi<=0&&ci<=0))&&tr.getS()<minz){ ret=tr;
|
||
|
minz=tr.getS();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
public Vertex pickVer(int x,int y){
|
||
|
int max=Integer.MAX_VALUE;
|
||
|
Vertex ret=null;
|
||
|
for (int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.v.size();j++){
|
||
|
Vertex ver=(Vertex)gr.v.elementAt(j);
|
||
|
if(Math.abs(ver.sx-x)<=6&&Math.abs(ver.sy-y)<=6&&ver.z<max){
|
||
|
ret=ver;
|
||
|
max=ver.z;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
public void setMaterial(Material m){
|
||
|
if(g==null||g.isEmpty())return;
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
((Group)g.elementAt(i)).setMaterial(m);
|
||
|
}
|
||
|
}
|
||
|
public void deleteFace(Face f){
|
||
|
if(f==null||!(f instanceof Triangle))return;
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.f.size();j++){
|
||
|
if(gr.f.elementAt(j)==f){ gr.f.removeElementAt(j);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void deleteVertex(Vertex v){
|
||
|
if(v==null)return;
|
||
|
for(int i=0;i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(int j=0;j<gr.f.size();j++){
|
||
|
Triangle tr=(Triangle)gr.f.elementAt(j);
|
||
|
if(tr.a==v||tr.b==v||tr.c==v){ gr.f.removeElement(tr);
|
||
|
j--;
|
||
|
}
|
||
|
}
|
||
|
gr.v.removeElement(v);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void vertexNorm(Vertex v){
|
||
|
int j,i,nn=0;
|
||
|
v.nx=v.ny=v.nz=0;
|
||
|
for(i=0; i<g.size();i++){
|
||
|
Group gr=(Group)g.elementAt(i);
|
||
|
for(j=0;j<gr.f.size();j++){
|
||
|
Triangle tr=(Triangle)gr.f.elementAt(j);
|
||
|
if((v==tr.a||v==tr.b||v==tr.c)&&tr.smooth){
|
||
|
nn++;
|
||
|
v.nz+=tr.nz;
|
||
|
v.nx+=tr.nx;
|
||
|
v.ny+=tr.ny;
|
||
|
}
|
||
|
}
|
||
|
v.nx/=nn;
|
||
|
v.ny/=nn;
|
||
|
v.nz/=nn;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void deleteLight(Light lig){
|
||
|
l.removeElement(lig);
|
||
|
}
|
||
|
|
||
|
/* public int containsVertex(Vertex ver) {
|
||
|
boolean r = false;
|
||
|
int i;
|
||
|
for (i = 0; i < v.size(); i++) {
|
||
|
Vertex ve = (Vertex)v.elementAt(i);
|
||
|
r = (ve.x == ver.x) && (ve.y == ver.y) && (ve.z == ver.z);
|
||
|
if (r) break;
|
||
|
}
|
||
|
return (r)?i:-1;
|
||
|
}*/
|
||
|
}
|