S3DEditor/src/Model.java

331 lines
10 KiB
Java
Raw Normal View History

2018-11-14 19:14:46 +02:00
// класс содержащий модель - массив групп и источников света
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;
}*/
}