Ejemplo n.º 1
0
void xEditTerrainHeight::_Update(Event * sender)
{
	Terrain * terrain = Environment::Instance()->GetTerrain();

	if (!terrain)
		return ;

	int op = xApp::Instance()->GetOperator();

	if (op != xTerrainOp::eOp_Terrain)
		return ;

	Point2f pt = IMouse::Instance()->GetPositionUnit();

	if (pt.x < 0 || pt.y < 0 || pt.x > 1 || pt.y > 1)
		return ;

	Ray ray = World::Instance()->MainCamera()->GetViewportRay(pt.x, pt.y);
	mBrush.position = terrain->GetPosition(ray);

	if (!IMouse::Instance()->KeyPressed(MKC_BUTTON0))
		return ;

	_UpdateGeometry();
}
Ejemplo n.º 2
0
	RayCheckInfo RayCheck(Ray ray, float dist)
	{
		RayCheckInfo info;

		Terrain * terriain = Environment::Instance()->GetTerrain();

		Vec3 pos = terriain->GetPosition(ray);

		if (pos != Vec3::Zero && pos.DistanceSq(ray.origin) < dist * dist)
		{
			info.bPicked = true;
			info.vPosition = pos;
		}

		return info;
	}
Ejemplo n.º 3
0
	void WaterBlock::Init(Water* water, int x, int z)
	{
		Shudown();

		mWater = water;
		mIndexX = x;
		mIndexZ = z;

		Terrain * terrain = Environment::Instance()->GetTerrain();

		int startX = kBlockGridSize * x;
		int startZ = kBlockGridSize * z;
		int sizeZ = water->GetSizeZ() - 1;

		WaterIdentityVertex wiv;
		Array<unsigned short> indexArray;

		for (int j = startZ; j < startZ + kBlockGridSize; ++j)
		{
			for (int i = startX; i < startX + kBlockGridSize; ++i)
			{
				char flag = mWater->GetData(i, j);
				
				if (flag == 1)
				{
					int _x = i;
					int _y = sizeZ - j;

					Vec3 p0 = terrain->GetPosition(_x + 0, _y + 0);
					Vec3 p1 = terrain->GetPosition(_x + 1, _y + 0);
					Vec3 p2 = terrain->GetPosition(_x + 0, _y + 1);
					Vec3 p3 = terrain->GetPosition(_x + 1, _y + 1);

					int i0 = wiv.Add(_x + 0, _y + 0, p0);
					int i1 = wiv.Add(_x + 1, _y + 0, p1);
					int i2 = wiv.Add(_x + 0, _y + 1, p2);
					int i3 = wiv.Add(_x + 1, _y + 1, p3);

					indexArray.PushBack(i0);
					indexArray.PushBack(i1);
					indexArray.PushBack(i2);
					indexArray.PushBack(i3);

					mBound.Merge(p0);
					mBound.Merge(p1);
					mBound.Merge(p2);
					mBound.Merge(p3);
				}
			}
		}

		if (indexArray.Size() == 0)
			return ;

		mRenderOp = new RenderOp();

		mRenderOp->iPrimCount = indexArray.Size() - 2;
		mRenderOp->ePrimType = PRIM_TRIANGLELIST;

		int iVertexCount = wiv.vertArray.Size();
		int iIndexCount = mRenderOp->iPrimCount * 3;

		VertexDeclarationPtr vdecl = mWater->GetVertexDecl();

		VertexBufferPtr vb = VideoBufferManager::Instance()->CreateVertexBuffer(iVertexCount * sizeof(Vec3), sizeof(Vec3));
		Vec3 * vert = (Vec3 *)vb->Lock(0, 0, LOCK_DISCARD);
		{
			for (int i = 0; i < iVertexCount; ++i)
			{
				vert[i] = wiv.vertArray[i].position;
			}
		}
		vb->Unlock();

		mRenderOp->vxStream.SetDeclaration(vdecl);
		mRenderOp->vxStream.Bind(0, vb, sizeof(Vec3));
		mRenderOp->vxStream.SetCount(iVertexCount);

		IndexBufferPtr ib = VideoBufferManager::Instance()->CreateIndexBuffer(iIndexCount * sizeof(short));
		short * idx = (short *)ib->Lock(0, 0, LOCK_DISCARD);
		{
			for (int i = 0; i < indexArray.Size(); i += 4)
			{ 
				*idx++ = indexArray[i + 0];
				*idx++ = indexArray[i + 1];
				*idx++ = indexArray[i + 2];

				*idx++ = indexArray[i + 2];
				*idx++ = indexArray[i + 1];
				*idx++ = indexArray[i + 3];
			}
		}
		ib->Unlock();

		mRenderOp->ixStream.Bind(ib, 0);
		mRenderOp->ixStream.SetCount(iIndexCount);
	}