Exemplo n.º 1
0
public func Advance()
{
    // Letzten Vertex ermitteln
    var iLastVertex = GetVertexNum() - 1;
    // Einschlag im Boden
    if (GBackSemiSolid(GetVertex(iLastVertex, 0) - GetX(), GetVertex(iLastVertex, 1) - GetY()))
        return(Remove());
    // Schon über fünf Schritte fortgeschritten: Schaden an Objekten verursachen
    if (iLastVertex > 5)
        BlastObjects(GetVertex(iLastVertex, 0), GetVertex(iLastVertex, 1), 3);
    // Neuen Schritt durchführen
    if (Not(AddVertex(GetVertex(iLastVertex, 0) + Local(0) + Random(Local(1)),
                      GetVertex(iLastVertex, 1) + Local(2) + Random(Local(3)) )))
        return(Remove());
    // Anziehung an ein Zielobjekt prüfen
    var pTarget;
    iLastVertex = GetVertexNum() - 1;
    if (iLastVertex > 7)
        if (pTarget = FindObject( 0,
                                  GetVertex(iLastVertex, 0) - GetX() - 50,
                                  GetVertex(iLastVertex, 1) - GetY() - 50,
                                  100,
                                  100,
                                  OCF_AttractLightning() ))
            Attraction(pTarget);
}
Exemplo n.º 2
0
	bool  cVertexBufferOGL::Compile(tVertexCompileFlag aFlags)
	{
		if(aFlags & eVertexCompileFlag_CreateTangents)
		{
            mbTangents = true;

			mVertexFlags |= eVertexFlag_Texture1;

			int idx = cMath::Log2ToInt((int)eVertexFlag_Texture1);

			int lSize = GetVertexNum()*4;
            mvVertexArray[idx].resize(lSize);

			cMath::CreateTriTangentVectors(&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture1)][0]),
				&mvIndexArray[0], GetIndexNum(),

				&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Position)][0]),
				kvVertexElements[cMath::Log2ToInt((int)eVertexFlag_Position)],

				&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture0)][0]),
				&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Normal)][0]),
				GetVertexNum()
				);
		}

		return true;
	}
Exemplo n.º 3
0
	void cVertexBufferVBO::Transform(const cMatrixf &a_mtxTransform)
	{
		float *pPosArray = GetArray(eVertexFlag_Position);
		float *pNormalArray = GetArray(eVertexFlag_Normal);
		float *pTangentArray = NULL;
		if(mbTangents)pTangentArray = GetArray(eVertexFlag_Texture1);

		int lVtxNum = GetVertexNum();

		cMatrixf mtxRot = a_mtxTransform.GetRotation();

		int lVtxStride = kvVertexElements[cMath::Log2ToInt(eVertexFlag_Position)];

		int lOffset = GetVertexNum()*4;

		for(int i=0; i<lVtxNum; i++)
		{
			float* pPos = &pPosArray[i*lVtxStride];
			float* pNorm = &pNormalArray[i*3];
			float* pTan = NULL;
			if(mbTangents)pTan = &pTangentArray[i*4];

			cVector3f vPos = cMath::MatrixMul(a_mtxTransform, cVector3f(pPos[0],pPos[1],pPos[2]));
			pPos[0] = vPos.x; pPos[1] = vPos.y; pPos[2] = vPos.z;

			if(mbHasShadowDouble){
				float* pExtraPos = &pPosArray[i*lVtxStride + lOffset];
				pExtraPos[0] = vPos.x; pExtraPos[1] = vPos.y; pExtraPos[2] = vPos.z;
			}

			cVector3f vNorm = cMath::MatrixMul(mtxRot, cVector3f(pNorm[0],pNorm[1],pNorm[2]));
			vNorm.Normalise();
			pNorm[0] = vNorm.x; pNorm[1] = vNorm.y; pNorm[2] = vNorm.z;

			if(mbTangents){
				cVector3f vTan = cMath::MatrixMul(mtxRot, cVector3f(pTan[0],pTan[1],pTan[2]));
				vTan.Normalise();
				pTan[0] = vTan.x; pTan[1] = vTan.y; pTan[2] = vTan.z;
			}
		}

		if(mbCompiled)
		{
			if(mbTangents)
				UpdateData(eVertexFlag_Position | eVertexFlag_Normal | eVertexFlag_Texture1,false);
			else
				UpdateData(eVertexFlag_Position | eVertexFlag_Normal,false);
		}
	}
Exemplo n.º 4
0
void TerrainRenderable::MakeVertexBuffer()
{
	auto device = Globals::GetDevice()->GetDeviceD3D9();
	int n=GetVertexNum();
	HRESULT res = device->CreateVertexBuffer(n * sizeof(TerrainVertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &m_pVB, 0);
	if (res != S_OK)
		ReportErr("Terrain CreateVB Failed");
	TerrainVertex* v = 0;
	int idx=0;
	m_pVB->Lock(0, 0, (void**)&v, 0);

	for (int y = 0; y < terrain_h; ++y)
	{
		for (int x = 0; x < terrain_w; ++x)
		{
			float posx=x;
			float posz=y;
			ConvertPos(posx,posz);
			m_VertexData.push_back(TerrainVertex(posx, m_pHeightField->GetHeight(x,y), posz, (float)x / terrain_w, (float)y / terrain_h));
			//v[idx++]=TerrainVertex(x*vertex_stride - orgX_Offset, GetTerrainHeight(x,y), y*vertex_stride - orgY_Offset, (float)x / terrain_w, (float)y / terrain_h);
		}
	}
	TerrainVertex* first=&(m_VertexData[0]);
	memcpy_s(v,n*sizeof(TerrainVertex),first,n*sizeof(TerrainVertex));
	m_pVB->Unlock();
}
Exemplo n.º 5
0
void XPolyline::SetUnit(const int& unit)
	{
	if(this->m_Unit == UNIT_NONE|| m_Unit == unit)
		{
		m_Unit = unit;
		return;
		}
	int i;
	int num = GetVertexNum();
	switch(m_Unit)// suppose only two type unit(inch and mm)
		{
		case UNIT_MM:
			if(unit == UNIT_INCH)
				{
				for(i =0; i < num; i++)
					{
					m_Point[i]/=25.4;
					}
				}
			break;
		case UNIT_INCH:
			if(unit == UNIT_MM)
				{
				for(i =0; i < num; i++)
					{
					m_Point[i]*=25.4;
					}
				}
			break;
		default:
			;
		}
	m_bObjChanged = true;
	}
Exemplo n.º 6
0
	iVertexBuffer* cVertexBufferOGL::CreateCopy(eVertexBufferUsageType aUsageType)
	{
		cVertexBufferOGL *pVtxBuff = hplNew( cVertexBufferOGL,(mpLowLevelGraphics,
			mVertexFlags,mDrawType,aUsageType,
			GetVertexNum(),GetIndexNum()) );

		//Copy the vertices to the new buffer.
		for(int i=0; i < klNumOfVertexFlags; i++)
		{
			if(kvVertexFlags[i] & mVertexFlags)
			{
				int lElements = kvVertexElements[i];
				if(mbTangents && kvVertexFlags[i] == eVertexFlag_Texture1)
					lElements=4;

				pVtxBuff->ResizeArray(kvVertexFlags[i], (int)mvVertexArray[i].size());

				memcpy(pVtxBuff->GetArray(kvVertexFlags[i]),
					&mvVertexArray[i][0], mvVertexArray[i].size() * sizeof(float));
			}
		}

		//Copy indices to the new buffer
		pVtxBuff->ResizeIndices(GetIndexNum());
		memcpy(pVtxBuff->GetIndices(), GetIndices(), GetIndexNum() * sizeof(unsigned int) );

		pVtxBuff->mbTangents = mbTangents;
		pVtxBuff->mbHasShadowDouble = mbHasShadowDouble;

		pVtxBuff->Compile(0);

		return pVtxBuff;
	}
Exemplo n.º 7
0
/*
 * @brief
 */
static void EmitFaceVertexes(node_t *node, face_t *f) {
	winding_t *w;
	int32_t i;

	if (f->merged || f->split[0] || f->split[1])
		return;

	w = f->w;
	for (i = 0; i < w->num_points; i++) {
		if (noweld) { // make every point unique
			if (d_bsp.num_vertexes == MAX_BSP_VERTS)
				Com_Error(ERR_FATAL, "MAX_BSP_VERTS\n");
			superverts[i] = d_bsp.num_vertexes;
			VectorCopy(w->points[i], d_bsp.vertexes[d_bsp.num_vertexes].point);
			d_bsp.num_vertexes++;
			c_uniqueverts++;
			c_totalverts++;
		} else
			superverts[i] = GetVertexNum(w->points[i]);
	}
	num_superverts = w->num_points;

	// this may fragment the face if > MAXEDGES
	FaceFromSuperverts(node, f, 0);
}
Exemplo n.º 8
0
// Returns whether the object has a vertex with the given CNAT value
global func HasCNAT(int cnat)
{
	for (var i = -1; i < GetVertexNum(); i++)
		if (GetVertex(i, VTX_CNAT) == cnat)
			return true;
	return false;
}
Exemplo n.º 9
0
// Returns the number of stuck vertices. (of this)
global func VerticesStuckSemi()
{
	var vertices = 0;
	// Loop through vertices.
	for (var i = -1; i < GetVertexNum(); i++)
		// Solid?
		if (GBackSemiSolid(GetVertex(i, VTX_X), GetVertex(i, VTX_Y)))
			// Count vertices.
			vertices++;
	return vertices;
}
Exemplo n.º 10
0
	cBoundingVolume cVertexBufferOGL::CreateBoundingVolume()
	{
		cBoundingVolume bv;

		int lNum = cMath::Log2ToInt((int)eVertexFlag_Position);

		bv.AddArrayPoints(&(mvVertexArray[lNum][0]), GetVertexNum());
		bv.CreateFromPoints(kvVertexElements[cMath::Log2ToInt(eVertexFlag_Position)]);

		return bv;
	}
Exemplo n.º 11
0
// e.g. clonk->SetVertexCNAT(k, CNAT_CollideHalfVehicle, true); for k != 2 makes the clonk behave correctly wrt. to HalfVehicle
global func SetVertexCNAT(int vtx, int val, bool set)
{
	if (val == nil || set == nil)
		return FatalError("this function requires its second and third parameter to be non-nil");
	if (!this)
		return FatalError("this function requires object context");
	if (vtx == nil)
		for (var i = GetVertexNum(); i-->0;)
			SetVertexCNAT(i, val, set);
	else
		SetVertex(vtx, VTX_CNAT, GetVertex(vtx, VTX_CNAT) & ~val | (set && val), 2);
}
Exemplo n.º 12
0
private func Timer()
{
  // Positionen
  var x0 = GetX(GetActionTarget(1)), y0 = GetY(GetActionTarget(1)), 
  x1 = GetX(GetActionTarget(0)), y1 = GetY(GetActionTarget(0));
  // Einzelne Vertexe mit Partikeln verschönern
  var i=0;
  var iVtxNum = GetVertexNum();
  while(i<iVtxNum)
  {
    SetVertex(i, 0, (x0+(x1-x0)*i/iVtxNum)+RandomX(5,-5)); 
    SetVertex(i, 1, (y0+(y1-y0)*i/iVtxNum)+RandomX(5,-5));
    DrawParticleLine ("LightningSpark", GetVertex(i)-GetX(), GetVertex(i, 1)-GetY(), 
		    GetVertex(i+1)-GetX(), GetVertex(i+1,1)-GetY(), 6, 60, RGB(250,0,0), RGB(250,0,0));
    DrawParticleLine ("BloodSpark", GetVertex(i)-GetX(), GetVertex(i, 1)-GetY(), 
		    GetVertex(i+1)-GetX(), GetVertex(i+1,1)-GetY(),  3, 25, RGB(250,100,100), RGB(250,100,100));
    i++;
  }
}
Exemplo n.º 13
0
void TerrainRenderablePlane::MakeVertexBuffer()
{
	auto device = Globals::GetDevice()->GetDeviceD3D9();
	int n = GetVertexNum();
	HRESULT res = device->CreateVertexBuffer(n * sizeof(TerrainVertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &m_pVB, 0);
	if (res != S_OK)
		ReportErr("Terrain CreateVB Failed");
	TerrainVertex* v = 0;
	int idx = 0;
	m_pVB->Lock(0, 0, (void**)&v, 0);

	m_VertexData.push_back(TerrainVertex(0 - w / 2, 0 , 0 - h / 2, 0, 0));
	m_VertexData.push_back(TerrainVertex(0 - w / 2, 0 , h - h / 2, 0, 1));
	m_VertexData.push_back(TerrainVertex(w - w / 2, 0 , h - h / 2, 1, 1));
	m_VertexData.push_back(TerrainVertex(w - w / 2, 0 , 0 - h / 2, 1, 0));

	TerrainVertex* first = &(m_VertexData[0]);
	memcpy_s(v, n*sizeof(TerrainVertex), first, n*sizeof(TerrainVertex));
	m_pVB->Unlock();
}
Exemplo n.º 14
0
 void XPolyline::UpdateBndBox()
	{
	if(m_bObjChanged)
	{
		m_BndBox.Reset();
		int Num = GetVertexNum();
		for(int i = 0; i < Num; i++)
		{		
			m_BndBox.AddVertex( m_Point[i] );
		}
		PNT & min = m_BndBox.GetMin();
		PNT & max = m_BndBox.GetMax();
		for(int i=0;i<3;i++)
		{
			if(max[2]-min[2]<0.1) 
			{
				min[i] -= 0.05;
				max[i] += 0.05;
			}
		}
		m_bObjChanged = false;
	}
	}
Exemplo n.º 15
0
void TerrainRenderable::Render(HippoD3d9Device* pdevice, unsigned int escapeTime)
{
	auto d3d9device = pdevice->GetDeviceD3D9();

	//*d3d9device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);*/
	//world matrix
	D3DXMATRIX tmpMatrix;
	D3DXMatrixMultiply(&tmpMatrix, &m_local_matrix, m_parent->GetWorldTransform());
	HRESULT v = m_fxhandle->SetMatrix("g_mWorld", &tmpMatrix);

	//wvp matrix
	auto proj = Globals::GetRender()->GetProjMatrix();
	auto view = Globals::GetRender()->GetViewMatrix();
	D3DXMATRIX vp = (*view)*(*proj);
	v = m_fxhandle->SetMatrix("g_mViewProjection", &vp);

	//camera
	const D3DXVECTOR3* pos=Globals::GetCurrentCamera()->GetPos();
	v = m_fxhandle->SetValue("g_camera_pos", pos, sizeof(D3DXVECTOR3));


	//texture
	v = m_fxhandle->SetTexture("g_DiffuseTex", m_pTextrue[0]);
	v = m_fxhandle->SetTexture("g_DetailTex", m_pTextrue[1]);
	v = m_fxhandle->SetTexture("g_NormalTex", m_pTextrue[2]);

	//tower info
	const GameEntityPtrCon& con = Globals::GetWorld()->GetAllTower();
	GameEntityPtrCon::const_iterator itr = con.begin();
	GameEntityPtrCon::const_iterator itrend = con.end();
	D3DXVECTOR4 tmp[2];
	int idx = 0;
	while (itr != itrend)
	{
		auto towerptr = (TowerEntity*)itr->get();
		D3DXVECTOR3* pos = towerptr->GetPos();
		float r = towerptr->GetRange();
		tmp[idx] = D3DXVECTOR4(pos->x, pos->y, pos->z, r);
		++itr;
		++idx;
	}
	v=m_fxhandle->SetVectorArray("towerInfo", tmp, 2);

	//robot info
	auto robot=Globals::GetWorld()->GetPlayer();
	D3DXVECTOR4 robotpos = D3DXVECTOR4(robot->GetPos()->x, robot->GetPos()->z, 2, 1);
	v=m_fxhandle->SetVector("robotInfo", &robotpos);

	d3d9device->SetStreamSource(0, m_pVB, 0, sizeof(TerrainVertex));
	d3d9device->SetVertexDeclaration(m_pVertexDecl);
	d3d9device->SetIndices(m_pIB);	UINT iPass, totalPasses;
	m_fxhandle->Begin(&totalPasses, 0);

	for (iPass = 0; iPass < totalPasses; iPass++)
	{
		m_fxhandle->BeginPass(iPass);
		//d3d9device->DrawPrimitive(D3DPT_POINTLIST,
		//	0,   // 将要绘制的索引缓冲区的起始地址
		//	GetVertexNum()); // 绘制的图元数量

		d3d9device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
			0,   // 将要绘制的索引缓冲区的起始地址
			0, // 索引数组中最小的索引值
			GetVertexNum(),   // 要绘制的索引数组中的顶点数量
			0, // 从索引数组中的第几个元素开始绘制图元
			GetTriangleNum()); // 绘制的图元数量
		
		m_fxhandle->EndPass();
	}

	m_fxhandle->End();
	return;
	//patch
	auto pthitr = m_all_patch.begin();
	while (pthitr != m_all_patch.end())
	{
		auto patch_fx =  (*pthitr)->GetPatchFx();
		auto patch_ib = (*pthitr)->GetIB();
		int tri_count = (*pthitr)->GetIndexCount() / 3;
		d3d9device->SetStreamSource(0, m_pVB, 0, sizeof(TerrainVertex));
		d3d9device->SetVertexDeclaration(m_pVertexDecl);

		HRESULT v = d3d9device->SetIndices(patch_ib);
		
		v=patch_fx->SetMatrix("g_mWorld", &tmpMatrix);
		v = patch_fx->SetMatrix("g_mViewProjection", &vp);
		v = patch_fx->SetValue("g_camera_pos", pos, sizeof(D3DXVECTOR3));
		
		
		UINT totalPasses;
		v=patch_fx->Begin(&totalPasses, 0);
		v = patch_fx->BeginPass(0);
		v = d3d9device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
			0,   // 将要绘制的索引缓冲区的起始地址
			0, // 索引数组中最小的索引值
			GetVertexNum(),   // 要绘制的索引数组中的顶点数量
			0, // 从索引数组中的第几个元素开始绘制图元
			tri_count); // 绘制的图元数量
		v = patch_fx->EndPass();

		++pthitr;
	}
}
Exemplo n.º 16
0
	bool cVertexBufferVBO::Compile(tVertexCompileFlag aFlags)
	{
		if(mbCompiled) return false;
		mbCompiled = true;

		//Create tangents
		if(aFlags & eVertexCompileFlag_CreateTangents)
		{
			mbTangents = true;

			mVertexFlags |= eVertexFlag_Texture1;

			int idx = cMath::Log2ToInt((int)eVertexFlag_Texture1);

			int lSize = GetVertexNum()*4;
			mvVertexArray[idx].resize(lSize);

			cMath::CreateTriTangentVectors(&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture1)][0]),
				&mvIndexArray[0], GetIndexNum(),

				&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Position)][0]),
				kvVertexElements[cMath::Log2ToInt((int)eVertexFlag_Position)],

				&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture0)][0]),
				&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Normal)][0]),
				GetVertexNum()
				);
		}

		GLenum usageType = GL_STATIC_DRAW_ARB;
		if(mUsageType== eVertexBufferUsageType_Dynamic) usageType = GL_DYNAMIC_DRAW_ARB;
		else if(mUsageType== eVertexBufferUsageType_Stream) usageType = GL_STREAM_DRAW_ARB;

		//Create the VBO vertex arrays
		for(int i=0;i< klNumOfVertexFlags; i++)
		{
			if(mVertexFlags & kvVertexFlags[i])
			{
				glGenBuffersARB(1,(GLuint *)&mvArrayHandle[i]);
				glBindBufferARB(GL_ARRAY_BUFFER_ARB, mvArrayHandle[i]);

				glBufferDataARB(GL_ARRAY_BUFFER_ARB, mvVertexArray[i].size()*sizeof(float),
						&(mvVertexArray[i][0]), usageType);

				glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

				//Log("%d-Handle: %d, size: %d \n",i,mvArrayHandle[i], mvVertexArray);
			}
		}

	    //Create the VBO index array
		glGenBuffersARB(1,(GLuint *)&mlElementHandle);
		glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,mlElementHandle);
		glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GetIndexNum()*sizeof(unsigned int),
														&mvIndexArray[0], usageType);
		glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0);

		//Log("VBO compile done!\n");

		return true;
	}
Exemplo n.º 17
0
void TerrainRenderablePlane::Render(HippoD3d9Device* pdevice, unsigned int escapeTime)
{
	auto d3d9device = pdevice->GetDeviceD3D9();

	//d3d9device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
	//world matrix
	D3DXMATRIX tmpMatrix;
	D3DXMatrixMultiply(&tmpMatrix, &m_local_matrix, m_parent->GetWorldTransform());
	HRESULT v = m_fxhandle->SetMatrix("g_mWorld", &tmpMatrix);

	//wvp matrix
	auto proj = Globals::GetRender()->GetProjMatrix();
	auto view = Globals::GetRender()->GetViewMatrix();
	D3DXMATRIX vp = (*view)*(*proj);
	v = m_fxhandle->SetMatrix("g_mViewProjection", &vp);

	//camera
	const D3DXVECTOR3* pos = Globals::GetCurrentCamera()->GetPos();
	v = m_fxhandle->SetValue("g_camera_pos", pos, sizeof(D3DXVECTOR3));

	//material
	D3DXCOLOR vWhite = D3DXCOLOR(0.5, 0.3, 0.2, 1);
	v = m_fxhandle->SetValue("g_MaterialDiffuseColor", &vWhite, sizeof(D3DXCOLOR));

	//texture
	v = m_fxhandle->SetTexture("g_MeshTexture", m_pTextrue[0]);

	//tower info
	auto alltowers = Globals::GetWorld()->GetAllTower();
	auto itr = alltowers.begin();
	D3DXVECTOR4 tmp[2];
	int idx = 0;
	while (itr != alltowers.end())
	{
		TowerEntity* pEntity = (TowerEntity*)((*itr).get());
		D3DXVECTOR3* pos = pEntity->GetPos();
		float r = pEntity->GetRange();
		tmp[idx] = D3DXVECTOR4(pos->x, pos->y, pos->z, r);
		++itr;
		++idx;
	}
	v = m_fxhandle->SetVectorArray("towerInfo", tmp, 2);

	//robot info
	auto player = Globals::GetWorld()->GetPlayer();
	pos = player->GetPos();
	D3DXVECTOR4 robotpos = D3DXVECTOR4(pos->x, pos->z, 12.f, 1.0f);
	v = m_fxhandle->SetVector("robotInfo", &robotpos);


	d3d9device->SetStreamSource(0, m_pVB, 0, sizeof(TerrainVertex));
	d3d9device->SetVertexDeclaration(m_pVertexDecl);
	d3d9device->SetIndices(m_pIB);	UINT iPass, totalPasses;
	m_fxhandle->Begin(&totalPasses, 0);

	for (iPass = 0; iPass < totalPasses; iPass++)
	{
		m_fxhandle->BeginPass(iPass);

		d3d9device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
			0,   // 将要绘制的索引缓冲区的起始地址
			0, // 索引数组中最小的索引值
			GetVertexNum(),   // 要绘制的索引数组中的顶点数量
			0, // 从索引数组中的第几个元素开始绘制图元
			GetTriangleNum()); // 绘制的图元数量

		m_fxhandle->EndPass();
	}

	m_fxhandle->End();

	m_border_renderable->Render(pdevice, escapeTime);
}