Esempio n. 1
0
Vector3 &Spline::getControlPoint(int pos)
{
	AX_ASSERT(pos < (int) m_controlPoints.size());

	return m_controlPoints[pos];
}
Esempio n. 2
0
bool Point::fromString(const char *str) {
	int v = sscanf(str, "%d %d", &x, &y);
	AX_ASSERT(v == 2);
	return v == 2;
}
Esempio n. 3
0
void Spline::generateSplineData(std::vector<Vector3>& result)
{
	result.clear();

	float  t, f, g, h;
	float len=0;
	int nDiv = 1;
	Vector3 point;

	// 线条模式
	if (m_width == 0)
	{
		for (int i=0; i<(int)m_controlPoints.size()-1; ++i) 
		{
			nDiv = (int)(std::max(std::max(abs(m_helpers[i].A.x), abs(m_helpers[i].A.y)), abs(m_helpers[i].A.z)) / m_intervalLength);
			if (nDiv == 0)
			{
				nDiv = 1;
			}

			point = m_controlPoints[i];
			if (i == 0)
			{
				result.push_back(point);
			}
			else if ((point - result[result.size()-1]).getLength() >= m_intervalLength/5.0f)
			{
				result.push_back(point);
			}
			
			for (int j=1; j<=nDiv; ++j)
			{
				t = 1.0f / (float)nDiv * (float)j;

				AX_ASSERT(t >= 0 && t <= 1.0 && "t is overflow!");

				f = t * t * (3.0f - 2.0f*t);
				g = t * (t-1.0f) * (t-1.0f);
				h = t * t * (t-1.0f);

				point.x = m_controlPoints[i].x + m_helpers[i].A.x * f + m_helpers[i].B.x * g + m_helpers[i].C.x * h;
				point.y = m_controlPoints[i].y + m_helpers[i].A.y * f + m_helpers[i].B.y * g + m_helpers[i].C.y * h;
				point.z = m_controlPoints[i].z + m_helpers[i].A.z * f + m_helpers[i].B.z * g + m_helpers[i].C.z * h;

				// 如果宽度为零, 是线条模式
				result.push_back(point);

			} // for
		} // for
	}
	else // 带状模式
	{
		std::vector<Vector3> tResult;

		for (int i=0; i<(int)m_controlPoints.size()-1; ++i) 
		{
		#if 0
			len = (m_controlPoints[i+1] - m_controlPoints[i]).getLength();
			nDiv = len / m_intervalLength;
		#else
			nDiv = (int)(std::max(std::max(abs(m_helpers[i].A.x), abs(m_helpers[i].A.y)), abs(m_helpers[i].A.z)) / m_intervalLength);
		#endif
			if (nDiv == 0)
			{
				nDiv = 1;
			}

			point = m_controlPoints[i];
			if (i == 0)
			{
				tResult.push_back(point);
			}
			else if ((point - tResult[tResult.size()-1]).getLength() >= m_intervalLength/5.0f)
			{
				tResult.push_back(point);
			}

			for (int j=1; j<=nDiv; ++j)
			{
			#if 0
				t = (float)(m_intervalLength * j) / len;
			#else
				t = 1.0f / (float)nDiv * (float)j;
			#endif
				AX_ASSERT(t >= 0 && t <= 1.0 && "t is overflow!");

				f = t * t * (3.0f - 2.0f*t);
				g = t * (t-1.0f) * (t-1.0f);
				h = t * t * (t-1.0f);

				point.x = m_controlPoints[i].x + m_helpers[i].A.x * f + m_helpers[i].B.x * g + m_helpers[i].C.x * h;
				point.y = m_controlPoints[i].y + m_helpers[i].A.y * f + m_helpers[i].B.y * g + m_helpers[i].C.y * h;
				point.z = m_controlPoints[i].z + m_helpers[i].A.z * f + m_helpers[i].B.z * g + m_helpers[i].C.z * h;

				tResult.push_back(point);
			} // for
		} // for

		int numResult = (int) tResult.size();
		if (numResult < 2)
		{
			return ;
		}

		Vector3 dir = tResult[1] - tResult[0];
		Vector3 crossDir;

		dir.z = 0;
		dir.normalize();
		crossDir = dir ^ Vector3(0, 0, 1);
		crossDir *= m_width / 2.0f;

		result.push_back(tResult[0] + crossDir);
		result.push_back(tResult[0]);
		result.push_back(tResult[0] - crossDir);

		for (int i=1; i<numResult-1; ++i)
		{
			dir = tResult[i+1] - tResult[i-1];
			if (dir.getLength() < 0.001 || (tResult[i+1]-tResult[i]).getLength() < 0.001)
			{
				continue ;
			}

			dir.z = 0;
			dir.normalize();

			Vector3 crossDir = dir ^ Vector3(0, 0, 1);
			crossDir *= m_width / 2.0f;

			result.push_back(tResult[i] + crossDir);
			result.push_back(tResult[i]);
			result.push_back(tResult[i] - crossDir);
		}

		dir = tResult[numResult-1] - tResult[numResult-2];
		dir.z = 0;
		dir.normalize();
		crossDir = dir ^ Vector3(0, 0, 1);
		crossDir *= m_width / 2.0f;

		result.push_back(tResult[numResult-1] + crossDir);
		result.push_back(tResult[numResult-1]);
		result.push_back(tResult[numResult-1] - crossDir);
	}
}
Esempio n. 4
0
	Thread::Thread() {
		m_exitEvent = new SyncEvent();
		m_handle = ::CreateThread(NULL, 0, ThreadProc, this, CREATE_SUSPENDED, NULL);
		AX_ASSERT(m_handle);
	}
Esempio n. 5
0
	SyncEvent::SyncEvent() : m_object(NULL) {
		m_object = ::CreateEvent(NULL, FALSE, FALSE, NULL);
		AX_ASSERT(m_object);
	}
Esempio n. 6
0
	void OutdoorEnv::createOceanMesh() {
		m_oceanMesh = nullptr;

		// calculate vertexbuffer and indexbuffer size
		float r = 1.0f;
		float num = 1;
		while (r < OCEAN_RADIUS) {
			num++;
			r *= OCEAN_MULTIPLY;
		}

		int numverts = num * OCEAN_SUBDIVIDE + 1; // + 1 for center
		int numidxes =(num - 1) * OCEAN_SUBDIVIDE * 2 * 3 + OCEAN_SUBDIVIDE * 3;

		// create render mesh
		m_oceanMesh = new Render::Mesh(Render::Mesh::Static);
		m_oceanMesh->initialize(numverts, numidxes);

		// initialize render mesh's vertexbuffer and indexbuffer
		Vertex* verts = m_oceanMesh->lockVertexes();
		Vertex* oldverts = verts;

		// clear to zero
		memset(verts, 0, sizeof(Vertex) * numverts);

		// first vertex is zero center
		verts->xyz.set(0, 0, 0);
		verts->normal.set(0, 0, 1);
		verts->tangent.set(1, 0, 0);
		verts->binormal.set(0, 1, 0);
		verts->st.set(0, 0); //  verts->st = verts->xyz.xy() * 0.01f;
		verts->rgba.set(255, 255, 255, 255);
		verts++;

		// inner vertexes
		const float angelStep = AX_PI * 2.0f / OCEAN_SUBDIVIDE;
		r = 1.0f;
		for (int i = 0; i < num; i++, r *= OCEAN_MULTIPLY) {
			for (int j = 0; j < OCEAN_SUBDIVIDE; j++) {
				float angle = j * angelStep;
				float s, c;
				Math::sincos(angle, s, c);
				verts->xyz.set(r * c, r * s, 0);
				verts->normal.set(0, 0, 1);
				verts->tangent.set(1, 0, 0);
				verts->binormal.set(0, 1, 0);
				verts->st.set(0, 0); // verts->st = verts->xyz.xy() * 0.01f;
				verts->rgba.set(255, 255, 255, 255);
				if (i == num - 1) {
					verts->st.set(0, 1);
				}
				verts++;
			}
		}

		m_oceanMesh->unlockVertexes();
		AX_ASSERT(verts - oldverts == numverts);

		// fill index buffer
		ushort_t* idxes = m_oceanMesh->lockIndexes();
		ushort_t* oldidxes = idxes;

		// innermost triangles
		for (int i = 0; i < OCEAN_SUBDIVIDE; i++) {
			*idxes++ = 0;
			*idxes++ =((i + 1) % OCEAN_SUBDIVIDE) + 1;
			*idxes++ = i + 1;
		}

		for (int i = 0; i < num-1; i++) {
			int start = i * OCEAN_SUBDIVIDE + 1;
			for (int j = 0; j < OCEAN_SUBDIVIDE; j++) {
				int p0 = start + j;
				int p1 = start +((j + 1) % OCEAN_SUBDIVIDE);
				int p2 = p0 + OCEAN_SUBDIVIDE;
				int p3 = p1 + OCEAN_SUBDIVIDE;

				*idxes++ = p0;
				*idxes++ = p1;
				*idxes++ = p2;
				*idxes++ = p2;
				*idxes++ = p1;
				*idxes++ = p3;
			}
		}
		m_oceanMesh->unlockIndexes();

		AX_ASSERT(idxes - oldidxes == numidxes);

		MaterialPtr mat = FindAsset_<Render::Material>("ocean");
		m_oceanMesh->setMaterial(mat);
	}
Esempio n. 7
0
	void OutdoorEnv::createSkyDome() {
		int tess = SKYDOME_TESS;
		int halftess = tess / 2;
		float radius = SKYDOME_RADIUS;

		int numverts = (tess + 1) * (halftess+1);
		int numidxes = tess * halftess * 2 * 3;

		m_skydome = new Mesh(Mesh::Static);
		m_skydome->initialize(numverts, numidxes);

		// fill vertexes
		Vertex* verts = m_skydome->lockVertexes();
		Vertex* vertsStart = verts;
		memset(verts, 0, sizeof(Vertex) * numverts);

		for (int i = 0; i <= halftess; i++) {
			float y = (float)i / halftess;
			float beta = AX_PI_2 *(y * 1.1f);
			float bs, bc;
			float vertbeta = AX_PI_2 * i / halftess;
			float vbs, vbc;
			Math::sincos(beta, bs, bc);
			Math::sincos(vertbeta, vbs, vbc);

			for (int j = 0; j <= tess; j++) {
				float alpha = AX_PI * 2.0f / tess * j;
				float as, ac;
				Math::sincos(alpha, as, ac);

				verts->xyz.x = vbs * ac;
				verts->xyz.y = vbs * as;
				verts->xyz.z = vbc;
				verts->normal.x = bs * ac;
				verts->normal.y = bs * as;
				verts->normal.z = bc;
				verts->xyz *= radius;
				verts->st.set(j / (float)tess, i / (float)halftess);
				verts->rgba.set(255,255,255,255);
				verts++;
			}
		}

		AX_ASSERT(verts - vertsStart == numverts);
		m_skydome->unlockVertexes();

		// fill indexes
		ushort_t* idxes = m_skydome->lockIndexes();
		ushort_t* idxesStart = idxes;

		for (int i = 0; i < halftess; i++) {
			for (int j = 0; j < tess; j++) {
				int p0 = i *(tess + 1) + j;
				int p1 = p0 + 1;
				int p2 = (i+1) *(tess + 1) + j;
				int p3 = p2 + 1;

				idxes[0] = p0;
				idxes[1] = p2;
				idxes[2] = p1;
				idxes[3] = p1;
				idxes[4] = p2;
				idxes[5] = p3;
				idxes += 6;
			}
		}

		AX_ASSERT(idxes - idxesStart == numidxes);
		m_skydome->unlockIndexes();
#if 0
		Material* mat = UniqueAsset_<Material>("null");
		Texture* tex = FindAsset_<Texture>("textures/testlalo");
		mat->setTexture(SamplerType::Diffuse, tex);
		m_skydome->setMaterial(mat);
#endif
		// create nishita render target
		m_skyNishitaRt = nullptr;

		if (!g_targetManager->isFormatSupport(TexFormat::RGBA16F)) {
			return;
		}

		m_skyNishitaRt = g_targetManager->allocTarget(Target::PermanentAlloc, 128, 64, TexFormat::RGBA16F);
		Target* miert = g_targetManager->allocTarget(Target::PermanentAlloc, 128, 64, TexFormat::RGBA16F);
		m_skyNishitaRt->getTexture()->setClampMode(Texture::CM_ClampToEdge);
		miert->getTexture()->setClampMode(Texture::CM_ClampToEdge);
		m_skyNishitaRt->attachColor(0, miert);

		m_skyNishitaMat = UniqueAsset_<Material>("_skyNishita");
		m_skyNishitaMat->setTexture(SamplerType::Diffuse, m_skyNishitaRt->getTexture());
		m_skyNishitaMat->setTexture(SamplerType::Specular, miert->getTexture());
		m_skyNishitaGenMat = 0; //UniqueAsset_<Material>("_skyNishitaGen");

		m_skydome->setMaterial(m_skyNishitaMat);
	}
	Target* D3D9target::getColorAttached(int index) const
	{
		AX_ASSERT(index < MAX_COLOR_ATTACHMENT);
		return m_colorAttached[index];
	}
	void D3D9target::detachColor(int index)
	{
		AX_ASSERT(index < MAX_COLOR_ATTACHMENT);
		m_colorAttached[index] = nullptr;
	}
Esempio n. 10
0
	void D3D9target::attachColor(int index, Target* c)
	{
		AX_ASSERT(index < MAX_COLOR_ATTACHMENT);
		m_colorAttached[index] = (D3D9target*)c;
	}