#include <acknex.h>
#include <default.c>
#include <d3d9.h>
function demo_init()
{
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_move();
def_debug();
def_debug();
}
VECTOR temp1;
ENTITY* merge_ent(ENTITY* source1,ENTITY* source2)
{
int vertices_source1=ent_status(source1,1);
int vertices_source2=ent_status(source2,1);
LPD3DXMESH mesh;
short *tbuffer_source1;
short *tbuffer_source2;
D3DVERTEX* vbuffer_source1;
D3DVERTEX* vbuffer_source2;
int triangles_source1;
int triangles_source2;
triangles_source1=ent_buffers(source1,0,0,&vbuffer_source1,&tbuffer_source1,NULL);
triangles_source2=ent_buffers(source2,0,0,&vbuffer_source2,&tbuffer_source2,NULL);
short* merged_tbuffer;
D3DVERTEX* merged_vbuffer;
int merged_triangles=triangles_source1+triangles_source2;
int merged_vertices=vertices_source1+vertices_source2;
int iterate;
int offsetv=0;
int offsett=0;
D3DXCreateMesh(merged_triangles,merged_vertices,D3DXMESH_MANAGED,pvertexdecl,pd3ddev,&mesh);
if(mesh!=NULL)
{
mesh->LockVertexBuffer(0, (void**)&merged_vbuffer);
mesh->LockIndexBuffer (0, (void**)&merged_tbuffer);
for (iterate=0;iterate<vertices_source1;iterate++)
{
temp1.x=source1.x+vbuffer_source1[iterate].x*source1.scale_x;
temp1.y=source1.y+vbuffer_source1[iterate].y*source1.scale_z;
temp1.z=source1.z+vbuffer_source1[iterate].z*source1.scale_y;
VECTOR final;
final.x=temp1.x;
final.y=temp1.z;
final.z=temp1.y;
vec_rotate(final.x,source1.pan);
merged_vbuffer[iterate].x=final.x;
merged_vbuffer[iterate].y=final.z;
merged_vbuffer[iterate].z=final.y;
merged_vbuffer[iterate].nx=vbuffer_source1[iterate].nx;
merged_vbuffer[iterate].nz=vbuffer_source1[iterate].ny;
merged_vbuffer[iterate].ny=vbuffer_source1[iterate].nz;
merged_vbuffer[iterate].u1=vbuffer_source1[iterate].u1;
merged_vbuffer[iterate].v1=vbuffer_source1[iterate].v1;
merged_vbuffer[iterate].u2=vbuffer_source1[iterate].u2;
merged_vbuffer[iterate].v2=vbuffer_source1[iterate].v2;
}
offsetv+=vertices_source1;
for (iterate=0;iterate<vertices_source2;iterate++)
{
temp1.x=source2.x+vbuffer_source2[iterate].x*source2.scale_x;
temp1.y=source2.y+vbuffer_source2[iterate].y*source2.scale_z;
temp1.z=source2.z+vbuffer_source2[iterate].z*source2.scale_y;
VECTOR final;
final.x=temp1.x;
final.y=temp1.z;
final.z=temp1.y;
vec_rotate(final.x,source2.pan);
merged_vbuffer[iterate+offsetv].x=final.x;
merged_vbuffer[iterate+offsetv].y=final.z;
merged_vbuffer[iterate+offsetv].z=final.y;
merged_vbuffer[iterate+offsetv].nx=vbuffer_source2[iterate].nx;
merged_vbuffer[iterate+offsetv].nz=vbuffer_source2[iterate].ny;
merged_vbuffer[iterate+offsetv].ny=vbuffer_source2[iterate].nz;
merged_vbuffer[iterate+offsetv].u1=vbuffer_source2[iterate].u1;
merged_vbuffer[iterate+offsetv].v1=vbuffer_source2[iterate].v1;
merged_vbuffer[iterate+offsetv].u2=vbuffer_source2[iterate].u2;
merged_vbuffer[iterate+offsetv].v2=vbuffer_source2[iterate].v2;
}
for (iterate=0;iterate<triangles_source1;iterate++)
{
merged_tbuffer[iterate*3] =tbuffer_source1[iterate*3];
merged_tbuffer[iterate*3+1]=tbuffer_source1[iterate*3+1];
merged_tbuffer[iterate*3+2]=tbuffer_source1[iterate*3+2];
}
offsett+=triangles_source1;
for (iterate=0;iterate<triangles_source2;iterate++)
{
merged_tbuffer[(iterate+offsett)*3] =tbuffer_source2[iterate*3] +offsetv;
merged_tbuffer[(iterate+offsett)*3+1]=tbuffer_source2[iterate*3+1]+offsetv;
merged_tbuffer[(iterate+offsett)*3+2]=tbuffer_source2[iterate*3+2]+offsetv;
}
mesh->UnlockVertexBuffer();
mesh->UnlockIndexBuffer();
ENTITY* merged_entity=ent_create(CUBE_MDL,nullvector,0);
BMAP* bmp_source1 = ent_getskin(source1, 1);
BMAP* bmp_source2 = ent_getskin(source2, 1);
ent_setmesh(merged_entity,mesh,0,0);
ent_setskin(merged_entity, bmp_source1, 1);
ent_setskin(merged_entity, bmp_source2, 2);
return merged_entity;
}
return NULL;
}
function main()
{
level_load("");
wait(4);
demo_init();
ENTITY* ent1=ent_create("dozer.mdl",nullvector,0);
ENTITY* ent2=ent_create("dozer.mdl",vector(120,0,0),0);
ent2.pan =45;
ent2.roll =20;
ent2.tilt =15;
ent1.tilt =10;
ent1.scale_z = 0.5;
ENTITY* merged=merge_ent(ent1,ent2);
merged.z+=800;//set this to zero, if you wanna see whether the result is identical source2 angle, scale and position
// ent_remove(ent1);
// wait(1);
// ent_remove(ent2);
// wait(1);
while(1)
{
// merged.pan+=1*time_step;
wait(1);
}
}