예제 #1
0
파일: renderer.cpp 프로젝트: Zhardas/engine
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();
}
예제 #3
0
파일: renderer.cpp 프로젝트: Zhardas/engine
// 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);
}