#include <acknex.h>
#include <default.c>
#include <d3d9.h>
function demo_init()
{
// vec_set(sky_color,vector(10,0,0));
video_switch(10,32,0);
vec_set(camera.x,vector(0,-400, 100));
camera.arc=90;
camera.pan=90;
camera.clip_near=1;
fps_min=60;
def_move();
def_debug();
def_debug();
}
VECTOR temp1;
VECTOR center;
ENTITY* merge_ent(ENTITY* source1,ENTITY* source2)
{
int vertices1=ent_status(source1,1);
int vertices2=ent_status(source2,1);
LPD3DXMESH mesh1;
short *triangle_buffer1;
short *triangle_buffer2;
D3DVERTEX* vertex_buffer1;
D3DVERTEX* vertex_buffer2;
int triangles1;
int triangles2;
triangles1=ent_buffers(source1,0,0,&vertex_buffer1,&triangle_buffer1,NULL);
triangles2=ent_buffers(source2,0,0,&vertex_buffer2,&triangle_buffer2,NULL);
short* merged_triangle_buffer;
D3DVERTEX* merged_vertex_buffer;
int merged_triangles=triangles1+triangles2;
int merged_vertices=vertices1+vertices2;
int iterate;
int offsetv=0;
int offsett=0;
vec_lerp(center.x, source1.x, source2.x, 0.5);//set a center between the two models origins
D3DXCreateMesh(merged_triangles,merged_vertices,D3DXMESH_MANAGED,pvertexdecl,pd3ddev,&mesh1);
if(mesh1!=NULL)
{
mesh1->LockVertexBuffer(0, (void**)&merged_vertex_buffer);
mesh1->LockIndexBuffer (0, (void**)&merged_triangle_buffer);
for (iterate=0;iterate<vertices1;iterate++)
{
temp1.x=vertex_buffer1[iterate].x;
temp1.y=vertex_buffer1[iterate].z;
temp1.z=vertex_buffer1[iterate].y;
vec_rotate(temp1.x, source1.pan);
vec_scale(temp1.x, source1.scale_x);
temp1.x *=source1.scale_x;
temp1.y *=source1.scale_y;
temp1.z *=source1.scale_z;
temp1.x +=source1.x - center.x;
temp1.y +=source1.y - center.y;
temp1.z +=source1.z - center.z;
merged_vertex_buffer[iterate].x=temp1.x+center.x;
merged_vertex_buffer[iterate].y=temp1.z+center.z;
merged_vertex_buffer[iterate].z=temp1.y+center.y;
merged_vertex_buffer[iterate].u1=vertex_buffer1[iterate].u1;
merged_vertex_buffer[iterate].v1=vertex_buffer1[iterate].v1;
merged_vertex_buffer[iterate].u2=vertex_buffer1[iterate].u2;
merged_vertex_buffer[iterate].v2=vertex_buffer1[iterate].v2;
}
offsetv+=vertices1;
for (iterate=0;iterate<vertices2;iterate++)
{
temp1.x=vertex_buffer1[iterate].x;
temp1.y=vertex_buffer1[iterate].z;
temp1.z=vertex_buffer1[iterate].y;
vec_rotate(temp1.x, source2.pan);
vec_scale(temp1.x, source2.scale_x);
temp1.x *=source2.scale_x;
temp1.y *=source2.scale_y;
temp1.z *=source2.scale_z;
temp1.x +=source2.x - center.x;
temp1.y +=source2.y - center.y;
temp1.z +=source2.z - center.z;
merged_vertex_buffer[iterate+offsetv].x=temp1.x+center.x;
merged_vertex_buffer[iterate+offsetv].y=temp1.z+center.z;
merged_vertex_buffer[iterate+offsetv].z=temp1.y+center.y;
merged_vertex_buffer[iterate+offsetv].u1=vertex_buffer2[iterate].u1;
merged_vertex_buffer[iterate+offsetv].v1=vertex_buffer2[iterate].v1;
merged_vertex_buffer[iterate+offsetv].u2=vertex_buffer2[iterate].u2;
merged_vertex_buffer[iterate+offsetv].v2=vertex_buffer2[iterate].v2;
}
for (iterate=0;iterate<triangles1;iterate++)
{
merged_triangle_buffer[iterate*3]=triangle_buffer1[iterate*3];
merged_triangle_buffer[iterate*3+1]=triangle_buffer1[iterate*3+1];
merged_triangle_buffer[iterate*3+2]=triangle_buffer1[iterate*3+2];
}
offsett+=triangles1;
for (iterate=0;iterate<triangles2;iterate++)
{
merged_triangle_buffer[(iterate+offsett)*3]=triangle_buffer2[iterate*3]+offsetv;
merged_triangle_buffer[(iterate+offsett)*3+1]=triangle_buffer2[iterate*3+1]+offsetv;
merged_triangle_buffer[(iterate+offsett)*3+2]=triangle_buffer2[iterate*3+2]+offsetv;
}
mesh1->UnlockVertexBuffer();
mesh1->UnlockIndexBuffer();
ENTITY* temp=ent_create(CUBE_MDL,nullvector,0);
BMAP* bmp_source1 = ent_getskin(source1, 1);
BMAP* bmp_source2 = ent_getskin(source2, 1);
ent_setmesh(temp,mesh1,0,0);
ent_setskin(temp, bmp_source1, 1);
ent_setskin(temp, bmp_source2, 2);
return temp;
}
return NULL;
}
function main()
{
level_load("");
wait(4);
demo_init();
ENTITY* ent1=ent_create("p.mdl",nullvector,0);
ENTITY* ent2=ent_create("p.mdl",vector(120,0,0),0);
ent2.pan =45;
ent2.roll =20;
ent2.tilt =15;
ent1.tilt =10;
ent1.scale_z = 0.2;
ENTITY* merged=merge_ent(ent1,ent2);
merged.z+=200;//set this to zero, if you wanna see whether the result is identical in angle, scale and position
// ent_remove(dozer1);
// wait(1);
// ent_remove(dozer2);
// wait(1);
while(1)
{
// merged.pan+=1*time_step;
wait(1);
}
}