File: scene.cpp

package info (click to toggle)
embree 3.12.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 27,412 kB
  • sloc: cpp: 173,822; xml: 3,737; ansic: 2,955; python: 1,628; sh: 480; makefile: 193; csh: 42
file content (84 lines) | stat: -rw-r--r-- 2,203 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2009-2020 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#include "scene.h"

namespace embree
{
  extern "C" int g_instancing_mode;

  TutorialScene::TutorialScene() {
  }

  TutorialScene::~TutorialScene() {
  }
  
  void TutorialScene::add(Ref<SceneGraph::GroupNode> group) 
  {
    for (auto& node : group->children) 
    {
      if (Ref<SceneGraph::LightNode> lightNode = node.dynamicCast<SceneGraph::LightNode>()) {
        lights.push_back(lightNode->light);
      } 
      else if (Ref<SceneGraph::TransformNode> xfmNode = node.dynamicCast<SceneGraph::TransformNode>()) {
        addGeometry(xfmNode->child);
        addGeometry(node);
      }
      else if (Ref<SceneGraph::PerspectiveCameraNode> cameraNode = node.dynamicCast<SceneGraph::PerspectiveCameraNode>()) {
        cameras.push_back(cameraNode);
      } 
      else {
        addGeometry(node);
      }
    }
  }
  
  unsigned TutorialScene::addGeometry(Ref<SceneGraph::Node> node) 
  {
    if (node->id == -1) {
      geometries.push_back(node);
      node->id = unsigned(geometries.size()-1);
    }
    return node->id;
  }
  
  unsigned TutorialScene::materialID(Ref<SceneGraph::MaterialNode> material) 
  {
    if (material->id == -1) {
      materials.push_back(material);
      material->id = unsigned(materials.size()-1);
    }
    return material->id;
  }
  
  unsigned TutorialScene::geometryID(Ref<SceneGraph::Node> geometry) 
  {
    assert(geometry->id != -1);
    return geometry->id;
  }
  
  void TutorialScene::print_camera_names ()
  {
    if (cameras.size() == 0) {
      std::cout << "no cameras inside the scene" << std::endl;
      return;
    }
    
    for (size_t i=0; i<cameras.size(); i++)
      std::cout << "camera " << i << ": " << cameras[i]->name << std::endl;
  }

  Ref<SceneGraph::PerspectiveCameraNode> TutorialScene::getDefaultCamera()
  {
    if (cameras.size()) return cameras[0];
    return nullptr;
  }

  Ref<SceneGraph::PerspectiveCameraNode> TutorialScene::getCamera(const std::string& name)
  {
    for (size_t i=0; i<cameras.size(); i++)
      if (cameras[i]->name == name) return cameras[i];
    
    THROW_RUNTIME_ERROR("camera \"" + name +"\" not found");
  }
};