Your second assignment of temp needs to be set to vertexbuffer2 instead of vertexbuffer1
im reworking the function a bit also..

heres what i came up with but normals seems weird

Code:
#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);
	}
	
}



it seems correct now ,the scaling

Last edited by Wjbender; 06/02/12 11:41.

Compulsive compiler