CEditableObject::~CEditableObject() { ClearGeometry(); }
void VoxelChunk::CreateMesh( UINT8* m_pBlocks, bool* _acted, unsigned int dimm )//lower corner { if (!_vao) _vao = new VAO(); _dirty = false; Color clr; clr.comp[0] = 255; clr.comp[1] = 255; clr.comp[2] = 255; clr.comp[3] = 255; int h_dimm = dimm>>1; const int _local_to_global_i = h_dimm + _lbl[0]; const int _local_to_global_j = h_dimm + _lbl[1]; const int _local_to_global_k = h_dimm + _lbl[2]; unsigned int num_created = 0; unsigned int global_index = 0; UINT8 tmp_res = 0; unsigned int x, y; for (unsigned int i = 0; i < size; i++) { x = (_local_to_global_i+i)*dimm*dimm; for (unsigned int j = 0; j < size; j++) { y = (_local_to_global_j+j)*dimm; for (unsigned int k = 0; k < size; k++) { tmp_res = EvaluateCell( m_pBlocks, _local_to_global_i+i, _local_to_global_j+j, _local_to_global_k+k, dimm ); if (tmp_res) { if ( _points == NULL ) { CreateGeometry(); } if (!_vbo) _vbo = new VBO(_points, NULL, 0, _vertex_len ); global_index = ( x+ y + _local_to_global_k+k );; //MapColor( &clr, m_pBlocks[global_index], false); MapColor( &clr, m_pBlocks[global_index], _acted[global_index]); _acted[global_index] = false; clr.comp[3] = tmp_res; SetColorForVoxel(i, j, k, &clr); _renderable_indexes[num_created] = i*size*size + j*size + k; ++num_created; } } } } _renderable_indexes_count = num_created; if ( num_created ) { _vbo->UpdateColorArray( _colors, _vertex_len ); _vbo->UpdateIndexArray( _renderable_indexes, _renderable_indexes_count ); _vao->bind( *_vbo ); } else { if ( _points != NULL ) { ClearGeometry(); } ClearMesh(); } }
VoxelChunk::~VoxelChunk() { ClearGeometry(); ClearMesh(); }
void ImposterNode::UpdateImposter() { Camera * camera = scene->GetCurrentCamera(); Camera * imposterCamera = new Camera(); Vector3 cameraPos = camera->GetPosition(); Entity * child = GetChild(0); AABBox3 bbox = child->GetWTMaximumBoundingBoxSlow(); Vector3 bboxCenter = bbox.GetCenter(); imposterCamera->Setup(camera->GetFOV(), camera->GetAspect(), camera->GetZNear(), camera->GetZFar()); imposterCamera->SetTarget(bbox.GetCenter()); imposterCamera->SetPosition(cameraPos); imposterCamera->SetUp(camera->GetUp()); imposterCamera->SetLeft(camera->GetLeft()); Rect viewport = RenderManager::Instance()->GetViewport(); const Matrix4 & mvp = imposterCamera->GetUniformProjModelMatrix(); AABBox3 screenBounds; GetOOBBoxScreenCoords(child, mvp, screenBounds); Vector4 pv(bboxCenter); pv = pv*mvp; pv.z = (pv.z/pv.w + 1.f) * 0.5f; float32 bboxCenterZ = pv.z; Vector2 screenSize = Vector2(screenBounds.max.x-screenBounds.min.x, screenBounds.max.y-screenBounds.min.y); Vector3 screenBillboardVertices[4]; screenBillboardVertices[0] = Vector3(screenBounds.min.x, screenBounds.min.y, screenBounds.min.z); screenBillboardVertices[1] = Vector3(screenBounds.max.x, screenBounds.min.y, screenBounds.min.z); screenBillboardVertices[2] = Vector3(screenBounds.min.x, screenBounds.max.y, screenBounds.min.z); screenBillboardVertices[3] = Vector3(screenBounds.max.x, screenBounds.max.y, screenBounds.min.z); center = Vector3(); Matrix4 invMvp = mvp; invMvp.Inverse(); for(int32 i = 0; i < 4; ++i) { //unproject Vector4 out; out.x = 2.f*(screenBillboardVertices[i].x-viewport.x)/viewport.dx-1.f; out.y = 2.f*(screenBillboardVertices[i].y-viewport.y)/viewport.dy-1.f; out.z = 2.f*screenBillboardVertices[i].z-1.f; out.w = 1.f; out = out*invMvp; DVASSERT(out.w != 0.f); out.x /= out.w; out.y /= out.w; out.z /= out.w; imposterVertices[i] = Vector3(out.x, out.y, out.z); center += imposterVertices[i]; } center /= 4.f; //draw RecreateFbo(screenSize); //Logger::Info("%f, %f", screenSize.x, screenSize.y); if(!block) { return; } direction = camera->GetPosition()-center; direction.Normalize(); distanceSquaredToCamera = (center-cameraPos).SquareLength(); float32 nearPlane = sqrtf(distanceSquaredToCamera); //float32 farPlane = nearPlane + (bbox.max.z-bbox.min.z); float32 w = (imposterVertices[1]-imposterVertices[0]).Length(); float32 h = (imposterVertices[2]-imposterVertices[0]).Length(); //TODO: calculate instead of +50 imposterCamera->Setup(-w/2.f, w/2.f, -h/2.f, h/2.f, nearPlane, nearPlane+50.f); Rect oldViewport = RenderManager::Instance()->GetViewport(); //Texture * target = fbo->GetTexture(); RenderManager::Instance()->AppendState(RenderState::STATE_SCISSOR_TEST); RenderManager::Instance()->State()->SetScissorRect(Rect(block->offset.x, block->offset.y, block->size.dx, block->size.dy)); RenderManager::Instance()->FlushState(); //TODO: use one "clear" function instead of two //if(block->size.x == 512.f) //{ // RenderManager::Instance()->ClearWithColor(0.f, .8f, 0.f, 1.f); //} //else if(block->size.x == 256.f) //{ // RenderManager::Instance()->ClearWithColor(0.f, .3f, 0.f, 1.f); //} //else if(block->size.x == 128.f) //{ // RenderManager::Instance()->ClearWithColor(.3f, .3f, 0.f, 1.f); //} //else //{ // RenderManager::Instance()->ClearWithColor(.3f, 0.f, 0.f, 1.f); //} RenderManager::Instance()->ClearWithColor(.0f, .0f, 0.f, .0f); RenderManager::Instance()->ClearDepthBuffer(); RenderManager::Instance()->RemoveState(RenderState::STATE_SCISSOR_TEST); RenderManager::Instance()->SetViewport(Rect(block->offset.x, block->offset.y, block->size.dx, block->size.dy), true); imposterCamera->SetTarget(center); imposterCamera->Set(); //TODO: remove this call HierarchicalRemoveCull(child); RenderManager::Instance()->FlushState(); child->Draw(); RenderManager::Instance()->SetViewport(oldViewport, true); isReady = true; state = STATE_IMPOSTER; //unproject screenBillboardVertices[0] = Vector3(screenBounds.min.x, screenBounds.min.y, bboxCenterZ); screenBillboardVertices[1] = Vector3(screenBounds.max.x, screenBounds.min.y, bboxCenterZ); screenBillboardVertices[2] = Vector3(screenBounds.min.x, screenBounds.max.y, bboxCenterZ); screenBillboardVertices[3] = Vector3(screenBounds.max.x, screenBounds.max.y, bboxCenterZ); for(int32 i = 0; i < 4; ++i) { //unproject Vector4 out; out.x = 2.f*(screenBillboardVertices[i].x-viewport.x)/viewport.dx-1.f; out.y = 2.f*(screenBillboardVertices[i].y-viewport.y)/viewport.dy-1.f; out.z = 2.f*screenBillboardVertices[i].z-1.f; out.w = 1.f; out = out*invMvp; DVASSERT(out.w != 0.f); out.x /= out.w; out.y /= out.w; out.z /= out.w; imposterVertices[i] = Vector3(out.x, out.y, out.z); } SafeRelease(imposterCamera); ClearGeometry(); CreateGeometry(); }