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; }
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); }