Exemple #1
0
int sphereSetup(float r, float **ppVertex, float **ppTexture)
{
	int count = 0;
	int bw = (int)(360/angleSpan);
	int bh = (int)(180/angleSpan);
	
	count = bw*bh;
	VertexPointCnt = count * 18;
	TexturePointCnt = count * 12;
	pVertex = malloc(VertexPointCnt * sizeof(float));
	pTexture = malloc(TexturePointCnt * sizeof(float));
	VertexPointCnt = 0;
	if (!pTexture || !pVertex){
		if (pTexture)
			free(pTexture);
		if (pVertex)
			free(pVertex);
		
		return -1;
	}
	generateVertexData(r);
	generateTexCoor();
	
	vCount = VertexPointCnt/3;
	
	*ppVertex = pVertex;
	*ppTexture = pTexture;
	return vCount;
}
Exemple #2
0
void Grid::create()
{
    // Allocate some storage to hold per-vertex data
    QVector<float> v;         // Vertices
    QVector<unsigned int> el; // Element indices

    // Generate the vertex data
    generateVertexData( v, el );

    // Create and populate the buffer objects
    m_positionBuffer.create();
    m_positionBuffer.setUsagePattern( QOpenGLBuffer::StaticDraw );
    m_positionBuffer.bind();
    m_positionBuffer.allocate( v.constData(), v.size() * sizeof( float ) );

#if 0
    m_indexBuffer.create();
    m_indexBuffer.setUsagePattern( QOpenGLBuffer::StaticDraw );
    m_indexBuffer.bind();
    m_indexBuffer.allocate( el.constData(), el.size() * sizeof( unsigned int ) );
#endif
    updateVertexArrayObject();
}
	void DTerrainPage::generate( DTerrainPageData* data )
	{
		if (!data)
		{
			return;
		}
		// validate input data
		if (data->batchSize > data->pageSize)
		{
			return;
		}

		bool bRegenerateVB = false;
		// we need the size to be valid.
		uint16 finalPageSize = validatePageSize(data->pageSize);
		uint16 finalBatchSize = validateBatchSize(data->batchSize);
		DReal  finalPageScale = data->pageScale;
		// if the new vertex settings are different to current one, we
		// have to re-generate vertext buffer.
		if (mPageScale != finalPageScale || mPageSize != finalPageSize || mBatchSize != finalBatchSize)
		{
			bRegenerateVB = true;
		}
		mPageSize = finalPageSize;
		mBatchSize = finalBatchSize;
		mPageScale = finalPageScale;

		// that's a must.
		assert(mBatchSize >= 2);

		// reset our quadtree
		if (mQuadTreeRoot)
		{
			delete mQuadTreeRoot;
		}
		DTerrainRegion rootRegion;
		int16 halfPageSize = (mPageSize - 1)/2;
		rootRegion.xMin = -halfPageSize;
		rootRegion.zMin = -halfPageSize;
		rootRegion.xMax = halfPageSize;
		rootRegion.zMax = halfPageSize;
		mQuadTreeRoot = new DTerrainQuadTreeNode(this, NULL, rootRegion, mBatchSize);

		// if the parameter is a null image, use an empty one.
		bool useEmptyImage = false;
		DImage2D* scaledHeightMap = NULL;
		scaledHeightMap = new DImage2D();
		float* emptyData = new float[mPageSize*mPageSize];
		memset(emptyData, 0, sizeof(float) * mPageSize*mPageSize);
		DImageDesc imgDesc;
		imgDesc.width = mPageSize;
		imgDesc.height = mPageSize;
		imgDesc.depth = 1;
		imgDesc.mipMapCount = 1;
		imgDesc.arraySize = 1;
		imgDesc.pixelFormat = PF_R32_Float;
		scaledHeightMap->loadFromData((char*)emptyData, imgDesc);
		scaledHeightMap->setAccess(IL_Write);
		scaledHeightMap->setWorkRect(ImageRect(0,0,mPageSize,mPageSize));
		delete emptyData;
		if (data->heightMap != NULL)
		{
			data->heightMap->scale(*scaledHeightMap);
		}

		// copy data to the height map.
		DUEL_LOCK_MUTEX(mDataMutex);

		if (mHeightMap != NULL)
		{
			delete mHeightMap;
		}
		mHeightMap = new DReal[mPageSize*mPageSize];
		if (mMorphDeltaMap != NULL)
		{
			delete mMorphDeltaMap;
		}
		mMorphDeltaMap = new DReal[mPageSize*mPageSize];
		memset(mMorphDeltaMap, 0, sizeof(DReal) * mPageSize * mPageSize);
		if (mNormalMap != NULL)
		{
			delete[] mNormalMap;
		}
		mNormalMap = new DVector3[mPageSize*mPageSize];
		memset(mNormalMap, 0, sizeof(DVector3) *mPageSize * mPageSize);

		float* imgSrc = (float*)scaledHeightMap->getChunkPtr();
		DReal* heightMapDst = mHeightMap;
		size_t destRowPitch = scaledHeightMap->getRowPitch();

		for (uint32 i = 0; i < mPageSize; ++i)
		{
			for (uint32 j = 0; j < mPageSize; ++j)
			{
				mHeightMap[i * mPageSize + j] = *(imgSrc + mPageSize * i + j);
			}
		}
		delete scaledHeightMap;

		if (bRegenerateVB)
		{
			generateVertexData();
			// now we have vertex data, we need to re-create index data for quadtree nodes.
			mQuadTreeRoot->generateIndexData();
		}

		requestHeightMapUpdate(rootRegion, false);
	}