int MineBoisage::generatePoutre(float diameter, vector3df &pt1, vector3df &pt2, SMeshBuffer * buffer, vector3df vecteurGalerie)
{
	vecteurGalerie.normalize();
	vecteurGalerie*=diameter/2.0f;
	int n = buffer->Vertices.size();
	// vertices
	buffer->Vertices.push_back( makeS3DVertex(pt1+vecteurGalerie, vector3df(0,+diameter/2.0f, 0), dimension2d<f32>(0,1),pt1)); // 0
	buffer->Vertices.push_back( makeS3DVertex(pt1+vecteurGalerie, vector3df(0,-diameter/2.0f, 0), dimension2d<f32>(0,0),pt1));  // 1
	buffer->Vertices.push_back( makeS3DVertex(pt1-vecteurGalerie, vector3df(0,-diameter/2.0f, 0), dimension2d<f32>(0,1),pt1)); // 2
	buffer->Vertices.push_back( makeS3DVertex(pt1-vecteurGalerie, vector3df(0,+diameter/2.0f, 0), dimension2d<f32>(0,0),pt1)); // 3
	buffer->Vertices.push_back( makeS3DVertex(pt2+vecteurGalerie, vector3df(0,+diameter/2.0f, 0), dimension2d<f32>(1,1),pt2));  // 4
	buffer->Vertices.push_back( makeS3DVertex(pt2+vecteurGalerie, vector3df(0,-diameter/2.0f, 0), dimension2d<f32>(1,0),pt2));  // 5
	buffer->Vertices.push_back( makeS3DVertex(pt2-vecteurGalerie, vector3df(0,-diameter/2.0f, 0), dimension2d<f32>(1,1),pt2));  // 6
	buffer->Vertices.push_back( makeS3DVertex(pt2-vecteurGalerie, vector3df(0,+diameter/2.0f, 0), dimension2d<f32>(1,0),pt2));  // 7
	// indices
	pushPoly(buffer, n+0, n+2, n+1);
	pushPoly(buffer, n+0, n+3, n+1);
	pushPoly(buffer, n+0, n+4, n+7);
	pushPoly(buffer, n+0, n+7, n+3);
	pushPoly(buffer, n+0, n+1, n+4);
	pushPoly(buffer, n+1, n+5, n+4);
	pushPoly(buffer, n+5, n+6, n+7);
	pushPoly(buffer, n+4, n+5, n+7);
	pushPoly(buffer, n+3, n+7, n+2);
	pushPoly(buffer, n+7, n+6, n+2);
	pushPoly(buffer, n+6, n+1, n+2);
	pushPoly(buffer, n+6, n+5, n+1);
	return 0;
}
MineBoisage::MineBoisage(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, MineProfil * profil, MineBloc * pMineBloc, vector3df vecteurGalerie)
		: scene::ISceneNode(parent, mgr, id)
{
	m_profil=*profil;
	m_pMineBloc=pMineBloc;
	m_buffer=NULL;
	m_mesh=NULL;
	vecteurGalerie.Y=0;
	vecteurGalerie.normalize();
	vector3df verticale(0.0, 1.0, 0.0);
	vector3df vecteurNormal = vecteurGalerie.crossProduct(verticale);

	m_buffer = new SMeshBuffer();
	m_mesh = new SMesh();

	// base du bois gauche : 
	generateCylinder(10, m_profil.m_s1, m_profil.m_s4, m_buffer,0,false);
	generateCylinder(10, m_profil.m_s2, m_profil.m_s3, m_buffer,0,false);
	generatePoutre(3.0, m_profil.m_s4, m_profil.m_s3, m_buffer,vecteurGalerie);
/*
	// recalculate normals
	s32 n = (s32)m_buffer->Indices.size();
	for (s32 i=0; i<n-3; i+=3)
	{
		core::plane3d<f32> p(
			m_buffer->Vertices[m_buffer->Indices[i+0]].Pos,
			m_buffer->Vertices[m_buffer->Indices[i+1]].Pos,
			m_buffer->Vertices[m_buffer->Indices[i+2]].Pos);
		p.Normal.normalize();

		m_buffer->Vertices[m_buffer->Indices[i+0]].Normal = p.Normal;
		m_buffer->Vertices[m_buffer->Indices[i+1]].Normal = p.Normal;
		m_buffer->Vertices[m_buffer->Indices[i+2]].Normal = p.Normal;
	}
*/
	video::IVideoDriver* driver = g_data.driver;
	m_buffer->Material.Wireframe = false; //true;
	m_buffer->Material.BackfaceCulling = true;
	m_buffer->Material.Lighting = true;
	m_buffer->Material.EmissiveColor=SColor(255,0,0,0);
	m_buffer->Material.AmbientColor=SColor(255,255,255,255);
	m_buffer->Material.DiffuseColor=SColor(255,255,255,255);
	//m_buffer->Material.NormalizeNormals=true;
	m_buffer->Material.FogEnable=false;
	m_buffer->Material.MaterialType=EMT_SOLID;
	m_buffer->Material.Shininess=0.0f;
	m_buffer->Material.Texture1=	driver->getTexture("media/wood.jpg");
//	m_buffer->recalculateBoundingBox();
	setDebugDataVisible(false);

	m_mesh->addMeshBuffer(m_buffer);
//	m_mesh->recalculateBoundingBox();

	// creation de la bbox
	Box.reset(m_profil.m_s1);
	Box.addInternalPoint(m_profil.m_s2);
	Box.addInternalPoint(m_profil.m_s3);
	Box.addInternalPoint(m_profil.m_s4);
}
	void CSPhysXObject_Character::addForce(vector3df dir, float force)
	{
//		if (!m_Controller) return;
//		if (!m_Controller->getActor()) return;

		dir.normalize();
		PxVec3 disp = PxVec3(dir.X, dir.Y, dir.Z) * force;
		m_TotalForce += vector3df(disp.x, disp.y, disp.z);
	}
S3DVertex&TrackVertex::makeS3DVertex()
{
    static S3DVertex v=S3DVertex();
    static vector3df default_normal(1.0,1.0,1.0);
    default_normal.normalize();
    static vector2df default_texture_coords(0.0,0.0);
    v.TCoords=default_texture_coords;
    v.Pos=xyz;
    v.Color=this->color;
    v.Normal=default_normal;
    return v;
}
void ZombieInstance :: Damage(int amount, vector3df force)
{
	currentHealth -= amount;

	// Brief stun:
	ChangeState(IDLE);
	timer = amount;

	force.normalize();
	velocity += force * (amount / 100.0f);

	CheckDeath();
}