void Renderer::DrawComplex(Drawable *complex_obj, UINT &index, bool parent_visible) { if (!parent_visible) { index++; } else { // World transformation D3DXVECTOR2 pivot = {complex_obj->size().width / 2, 0}; D3DXVECTOR2 scaling = {complex_obj->scale().width, complex_obj->scale().height}; D3DXVECTOR2 moving = {complex_obj->position().x - Game::instance()->instance()->width() / 2, complex_obj->position().y - Game::instance()->instance()->height() / 2}; D3DXMATRIX matFinal; D3DXMatrixTransformation2D(&matFinal, &pivot, 1.0f, &scaling, &pivot, complex_obj->rotation(), &moving); device_->SetTransform(D3DTS_WORLD, &matFinal); // Draw complex_obj->Draw(this, &index); // Reset world transformation D3DXMatrixIdentity(&matFinal); device_->SetTransform(D3DTS_WORLD, &matFinal); } for (const auto &drawable_obj : complex_obj->complex_list_) { DrawComplex(drawable_obj.get(), index, (complex_obj->visible() && parent_visible)); } }
void CIppsSignalDC::Draw() { SetMinMax(); SetPoints(); if (m_pSignal->Complex()) DrawComplex(); else DrawReal(); }
// TODO(Zhardas): Make a template for vertex buffer structure. void Renderer::DrawScene(std::shared_ptr<Scene> scene) { LPDIRECT3DDEVICE9 device = device_; device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, color_.r, color_.g, color_.b), 1.0f, 0); device->BeginScene(); // Move camera auto cam_pos = scene->camera_->position_; D3DXMATRIX view_matrix; D3DXMatrixIdentity(&view_matrix); view_matrix(3, 0) = -cam_pos.x; view_matrix(3, 1) = -cam_pos.y; view_matrix(3, 2) = cam_pos.z; // TODO(Zhardas): 3D: Check the assigned value. device->SetTransform(D3DTS_VIEW, &view_matrix); for (const auto &layer : *scene->GetLayers()) { // NOTE: Scene has a limit of 256 layers. UINT index = 0; // Generate Vertex Buffer switch (layer->type()) { case Layer::STATIC: { if (layer->reload_) { layer->reload_ = false; if (layer->vertex_buffer_ != NULL) { layer->vertex_buffer_->Release(); } layer->vertex_buffer_ = GenerateVertexBuffer(STATIC, &layer->drawable_list_); } break; } case Layer::DYNAMIC: { layer->vertex_buffer_ = GenerateVertexBuffer(DYNAMIC, &layer->drawable_list_); break; } } // Setup and draw if (layer->vertex_buffer_ != NULL) { device_->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); device_->SetStreamSource(0, layer->vertex_buffer_, 0, sizeof(v_3ct)); for (const auto &obj : layer->drawable_list_) { DrawComplex(obj.get(), index, layer->visible_); } } // Release dynamic buffers if (layer->type() == Layer::DYNAMIC && layer->vertex_buffer_ != nullptr) { layer->vertex_buffer_->Release(); layer->vertex_buffer_ = NULL; } } device->EndScene(); device->Present(NULL, NULL, NULL, NULL); }