void init(IStorm3D* s3d, IStorm3D_Scene* scene) {
				
		GenParticleSystem::init(s3d, scene);
		
		std::string fileName;
		m_pb->getValue(PB_POINT_ARRAY_MODEL_FILE, fileName);
		if(fileName.empty())
			return;
		
		IStorm3D_Model* model = s3d->CreateNewModel();
		if(model->LoadS3D(fileName.c_str())) 
		{
			Iterator<IStorm3D_Model_Object*>* obj = model->ITObject->Begin();
			IStorm3D_Mesh* mesh = obj->GetCurrent()->GetMesh();
			if(mesh) {
				boost::shared_ptr<ParticleMesh> pm(new ParticleMesh());
				pm->verts.resize(mesh->GetVertexCount());
				pm->normals.resize(mesh->GetVertexCount());
				Storm3D_Vertex* v = mesh->GetVertexBuffer();
				for(int i = 0; i < mesh->GetVertexCount(); i++) {
					pm->verts[i] = v[i].position;
					pm->normals[i] = v[i].normal;
				}
				m_mesh.swap(pm);
			}
			delete obj;
		}
		delete model;

	}
void PointArrayParticleSystem::init(IStorm3D* s3d, IStorm3D_Scene* scene)
{
    defaultInit(s3d, scene, *m_eds);

    std::string fileName = m_eds->modelFile;
    if(fileName.empty())
        return;

    Matrix sm;
    Matrix rm;
    QUAT q;
    q.MakeFromAngles(m_eds->rotation.x, m_eds->rotation.y, m_eds->rotation.z);
    rm.CreateRotationMatrix(q);
    sm.CreateScaleMatrix(m_eds->scale);
    sm.Multiply(rm);
    IStorm3D_Model* model = s3d->CreateNewModel();
    assert(model != NULL);

    if(model->LoadS3D(fileName.c_str()))
    {
        Iterator<IStorm3D_Model_Object*>* obj = model->ITObject->Begin();
        assert(obj != NULL);

        boost::shared_ptr<PointArray> pm(new PointArray());
        for(; !obj->IsEnd(); obj->Next())
        {
            IStorm3D_Mesh* mesh = obj->GetCurrent()->GetMesh();
            VC3 opos = obj->GetCurrent()->GetPosition();

            if(mesh)
            {
                int base = pm->verts.size();
                pm->verts.resize(base + mesh->GetVertexCount());
                pm->normals.resize(base + mesh->GetVertexCount());

                Storm3D_Vertex *v = mesh->GetVertexBuffer();
                for(int i = 0; i < mesh->GetVertexCount(); i++)
                {
                    Vector pos = v[i].position + opos;
                    Vector nor = v[i].normal;
                    sm.TransformVector(pos);
                    rm.RotateVector(nor);

                    pm->verts[base + i] = pos;
                    pm->normals[base + i] = nor;
                }
            }
        }

        m_parray.swap(pm);
        if(m_eds->firstVertex < 0)
            m_eds->firstVertex = 0;
        if(m_eds->lastVertex >= (int)m_parray->verts.size())
            m_eds->lastVertex = m_parray->verts.size()-1;

        delete obj;
    }
    delete model;
}
Ejemplo n.º 3
0
	void createMesh(IStorm3D_Mesh &mesh)
	{
		Vector v[8];
		v[0] = Vector(data.radiusX, 0, data.radiusZ);
		v[1] = Vector(data.radiusX, 0, -data.radiusZ);
		v[2] = Vector(-data.radiusX, 0, data.radiusZ);
		v[3] = Vector(-data.radiusX, 0, -data.radiusZ);

		v[4] = v[0] + Vector(0, data.height, 0);
		v[5] = v[1] + Vector(0, data.height, 0);
		v[6] = v[2] + Vector(0, data.height, 0);
		v[7] = v[3] + Vector(0, data.height, 0);

		mesh.ChangeVertexCount(8);
		mesh.ChangeFaceCount(24);

		Storm3D_Vertex *vertexBuffer = mesh.GetVertexBuffer();
		Storm3D_Face *faceBuffer = mesh.GetFaceBuffer();

		for(int i = 0; i < 8; ++i)
			vertexBuffer[i].position = v[i];

		faceBuffer[0].vertex_index[0] = 0;
		faceBuffer[0].vertex_index[1] = 1;
		faceBuffer[0].vertex_index[2] = 2;
		faceBuffer[1].vertex_index[0] = 1;
		faceBuffer[1].vertex_index[1] = 2;
		faceBuffer[1].vertex_index[2] = 3;
		faceBuffer[2].vertex_index[0] = 4;
		faceBuffer[2].vertex_index[1] = 5;
		faceBuffer[2].vertex_index[2] = 6;
		faceBuffer[3].vertex_index[0] = 5;
		faceBuffer[3].vertex_index[1] = 6;
		faceBuffer[3].vertex_index[2] = 7;
		faceBuffer[4].vertex_index[0] = 0;
		faceBuffer[4].vertex_index[1] = 1;
		faceBuffer[4].vertex_index[2] = 4;
		faceBuffer[5].vertex_index[0] = 4;
		faceBuffer[5].vertex_index[1] = 5;
		faceBuffer[5].vertex_index[2] = 1;
		faceBuffer[6].vertex_index[0] = 2;
		faceBuffer[6].vertex_index[1] = 3;
		faceBuffer[6].vertex_index[2] = 6;			
		faceBuffer[7].vertex_index[0] = 6;
		faceBuffer[7].vertex_index[1] = 7;
		faceBuffer[7].vertex_index[2] = 3;
		faceBuffer[8].vertex_index[0] = 0;
		faceBuffer[8].vertex_index[1] = 2;
		faceBuffer[8].vertex_index[2] = 6;
		faceBuffer[9].vertex_index[0] = 6;
		faceBuffer[9].vertex_index[1] = 4;
		faceBuffer[9].vertex_index[2] = 0;
		faceBuffer[10].vertex_index[0] = 1;
		faceBuffer[10].vertex_index[1] = 3;
		faceBuffer[10].vertex_index[2] = 7;
		faceBuffer[11].vertex_index[0] = 7;
		faceBuffer[11].vertex_index[1] = 5;
		faceBuffer[11].vertex_index[2] = 1;

		faceBuffer[0+12].vertex_index[0] = 0;
		faceBuffer[0+12].vertex_index[1] = 2;
		faceBuffer[0+12].vertex_index[2] = 1;
		faceBuffer[1+12].vertex_index[0] = 1;
		faceBuffer[1+12].vertex_index[1] = 3;
		faceBuffer[1+12].vertex_index[2] = 2;
		faceBuffer[2+12].vertex_index[0] = 4;
		faceBuffer[2+12].vertex_index[1] = 6;
		faceBuffer[2+12].vertex_index[2] = 5;
		faceBuffer[3+12].vertex_index[0] = 5;
		faceBuffer[3+12].vertex_index[1] = 7;
		faceBuffer[3+12].vertex_index[2] = 6;
		faceBuffer[4+12].vertex_index[0] = 0;
		faceBuffer[4+12].vertex_index[1] = 4;
		faceBuffer[4+12].vertex_index[2] = 1;
		faceBuffer[5+12].vertex_index[0] = 4;
		faceBuffer[5+12].vertex_index[1] = 1;
		faceBuffer[5+12].vertex_index[2] = 5;
		faceBuffer[6+12].vertex_index[0] = 2;
		faceBuffer[6+12].vertex_index[1] = 6;
		faceBuffer[6+12].vertex_index[2] = 3;			
		faceBuffer[7+12].vertex_index[0] = 6;
		faceBuffer[7+12].vertex_index[1] = 3;
		faceBuffer[7+12].vertex_index[2] = 7;
		faceBuffer[8+12].vertex_index[0] = 0;
		faceBuffer[8+12].vertex_index[1] = 6;
		faceBuffer[8+12].vertex_index[2] = 2;
		faceBuffer[9+12].vertex_index[0] = 6;
		faceBuffer[9+12].vertex_index[1] = 0;
		faceBuffer[9+12].vertex_index[2] = 4;
		faceBuffer[10+12].vertex_index[0] = 1;
		faceBuffer[10+12].vertex_index[1] = 7;
		faceBuffer[10+12].vertex_index[2] = 3;
		faceBuffer[11+12].vertex_index[0] = 7;
		faceBuffer[11+12].vertex_index[1] = 1;
		faceBuffer[11+12].vertex_index[2] = 5;
	}