forked from StrafesNET/strafe-client
insane sphere gen
This commit is contained in:
parent
dd6b5bed24
commit
1e4025d1d0
@ -126,6 +126,146 @@ const CORNERWEDGE_DEFAULT_NORMALS:[Planar64Vec3;5]=[
|
||||
Planar64Vec3::int( 0,-1, 0),//CornerWedge::Bottom
|
||||
Planar64Vec3::int( 0, 0,-1),//CornerWedge::Front
|
||||
];
|
||||
const GON:u32=6;
|
||||
const SPHERE_STUFF:([[[[u32;3];4];((GON-1)*(GON-1)) as usize];6])={
|
||||
const CUBE_EDGES:[[u32;2];12]=[[0,1],[0,3],[0,7],[1,2],[1,6],[2,3],[2,5],[3,4],[4,5],[4,7],[5,6],[6,7]];
|
||||
const fn get_pos_id(p:[[u32;3];4],tex_id:u32)->u32{
|
||||
if p[0][1]==tex_id{
|
||||
return p[0][0];
|
||||
}
|
||||
if p[1][1]==tex_id{
|
||||
return p[1][0];
|
||||
}
|
||||
if p[2][1]==tex_id{
|
||||
return p[2][0];
|
||||
}
|
||||
if p[3][1]==tex_id{
|
||||
return p[3][0];
|
||||
}
|
||||
panic!("tex missing")
|
||||
}
|
||||
const fn get_edge_id(v0:u32,v1:u32)->(u32,bool){
|
||||
(match if v0<v1{[v0,v1]}else{[v1,v0]}{
|
||||
[0,1]=>0,
|
||||
[0,3]=>1,
|
||||
[0,7]=>2,
|
||||
[1,2]=>3,
|
||||
[1,6]=>4,
|
||||
[2,3]=>5,
|
||||
[2,5]=>6,
|
||||
[3,4]=>7,
|
||||
[4,5]=>8,
|
||||
[4,7]=>9,
|
||||
[5,6]=>10,
|
||||
[6,7]=>11,
|
||||
_=>panic!(":)")
|
||||
},v0<v1)
|
||||
}
|
||||
const fn get_idx(face_id:u32,v00:u32,v10:u32,v11:u32,v01:u32,x:u32,y:u32)->u32{
|
||||
if x==0&&y==0{
|
||||
return v00
|
||||
}
|
||||
if x==0&&y==GON-1{
|
||||
return v01
|
||||
}
|
||||
if x==GON-1&&y==GON-1{
|
||||
return v11
|
||||
}
|
||||
if x==GON-1&&y==0{
|
||||
return v10
|
||||
}
|
||||
if x==0{
|
||||
//left edge
|
||||
let (edge_id,parity)=get_edge_id(v00,v01);
|
||||
if parity{
|
||||
return 8+edge_id*(GON-2)+(y-1)
|
||||
}else{
|
||||
return 8+edge_id*(GON-2)+(GON-(y-1))
|
||||
}
|
||||
}
|
||||
if x==GON-1{
|
||||
//right edge
|
||||
let (edge_id,parity)=get_edge_id(v10,v11);
|
||||
if parity{
|
||||
return 8+edge_id*(GON-2)+(y-1)
|
||||
}else{
|
||||
return 8+edge_id*(GON-2)+(GON-(y-1))
|
||||
}
|
||||
}
|
||||
if y==0{
|
||||
//top edge
|
||||
let (edge_id,parity)=get_edge_id(v00,v10);
|
||||
if parity{
|
||||
return 8+edge_id*(GON-2)+(x-1)
|
||||
}else{
|
||||
return 8+edge_id*(GON-2)+(GON-(x-1))
|
||||
}
|
||||
}
|
||||
if y==GON-1{
|
||||
//bottom edge
|
||||
let (edge_id,parity)=get_edge_id(v01,v11);
|
||||
if parity{
|
||||
return 8+edge_id*(GON-2)+(x-1)
|
||||
}else{
|
||||
return 8+edge_id*(GON-2)+(GON-(x-1))
|
||||
}
|
||||
}
|
||||
return 8+12*(GON-2)+face_id*(GON-2)*(GON-2)+(x-1)+(y-1)*(GON-2)
|
||||
}
|
||||
//topology (indexed polys)
|
||||
let mut polys=[[[[0u32;3];4];((GON-1)*(GON-1)) as usize];6];
|
||||
let mut face_id=0;
|
||||
while face_id<6{
|
||||
let p=CUBE_DEFAULT_POLYS[face_id];
|
||||
//vertex ids
|
||||
let v00=get_pos_id(p,0);//top left
|
||||
let v10=get_pos_id(p,1);//top right
|
||||
let v11=get_pos_id(p,2);//bottom right
|
||||
let v01=get_pos_id(p,3);//bottom left
|
||||
let mut i=0;
|
||||
while i<(GON-1)*(GON-1){
|
||||
let x=i as u32%GON;
|
||||
let y=i as u32/GON;
|
||||
let i00=get_idx(face_id as u32,v00,v10,v11,v01,x+0,y+0);
|
||||
let i10=get_idx(face_id as u32,v00,v10,v11,v01,x+1,y+0);
|
||||
let i11=get_idx(face_id as u32,v00,v10,v11,v01,x+1,y+1);
|
||||
let i01=get_idx(face_id as u32,v00,v10,v11,v01,x+0,y+1);
|
||||
//[pos,tex,norm]
|
||||
polys[face_id][i as usize][0]=[i00,(x+0)+(y+0)*GON,i00];
|
||||
polys[face_id][i as usize][1]=[i10,(x+1)+(y+0)*GON,i10];
|
||||
polys[face_id][i as usize][2]=[i11,(x+1)+(y+1)*GON,i11];
|
||||
polys[face_id][i as usize][3]=[i01,(x+0)+(y+1)*GON,i01];
|
||||
i+=1;
|
||||
}
|
||||
face_id+=1;
|
||||
}
|
||||
//verts
|
||||
const N_VERTS:usize=(8+12*(GON-2)+6*(GON-2)*(GON-2)) as usize;
|
||||
let mut verts=[Planar64Vec3::ZERO;N_VERTS];
|
||||
let mut i=0;
|
||||
while i<8{
|
||||
verts[i]=CUBE_DEFAULT_VERTICES[i].normalize();
|
||||
i+=1;
|
||||
}
|
||||
i=0;
|
||||
while i<12{
|
||||
//
|
||||
}
|
||||
i=0;
|
||||
while i<6{
|
||||
//
|
||||
}
|
||||
//tex
|
||||
let mut tex=[TextureCoordinate::new(0.0,0.0);(GON*GON) as usize];
|
||||
let mut i=0;
|
||||
while i<(GON*GON) as usize{
|
||||
let x=i as u32%GON;
|
||||
let y=i as u32/GON;
|
||||
tex[i]=TextureCoordinate::new(x as f32/(GON-1) as f32,y as f32/(GON-1) as f32);
|
||||
i+=1;
|
||||
}
|
||||
(verts,tex,polys)
|
||||
};
|
||||
pub fn unit_sphere()->crate::model::IndexedModel{
|
||||
let mut indexed_model=crate::model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),Color4::ONE).remove(0);
|
||||
for pos in indexed_model.unique_pos.iter_mut(){
|
||||
|
Loading…
Reference in New Issue
Block a user