void SignedDistanceFieldText::CreateScene() { ResourceCache* cache = GetSubsystem<ResourceCache>(); scene_ = new Scene(context_); // Create the Octree component to the scene. This is required before adding any drawable components, or else nothing will // show up. The default octree volume will be from (-1000, -1000, -1000) to (1000, 1000, 1000) in world coordinates; it // is also legal to place objects outside the volume but their visibility can then not be checked in a hierarchically // optimizing manner scene_->CreateComponent<Octree>(); // Create a child scene node (at world origin) and a StaticModel component into it. Set the StaticModel to show a simple // plane mesh with a "stone" material. Note that naming the scene nodes is optional. Scale the scene node larger // (100 x 100 world units) Node* planeNode = scene_->CreateChild("Plane"); planeNode->SetScale(Vector3(100.0f, 1.0f, 100.0f)); StaticModel* planeObject = planeNode->CreateComponent<StaticModel>(); planeObject->SetModel(cache->GetResource<Model>("Models/Plane.mdl")); planeObject->SetMaterial(cache->GetResource<Material>("Materials/StoneTiled.xml")); // Create a directional light to the world so that we can see something. The light scene node's orientation controls the // light direction; we will use the SetDirection() function which calculates the orientation from a forward direction vector. // The light will use default settings (white light, no shadows) Node* lightNode = scene_->CreateChild("DirectionalLight"); lightNode->SetDirection(Vector3(0.6f, -1.0f, 0.8f)); // The direction vector does not need to be normalized Light* light = lightNode->CreateComponent<Light>(); light->SetLightType(LIGHT_DIRECTIONAL); // Create more StaticModel objects to the scene, randomly positioned, rotated and scaled. For rotation, we construct a // quaternion from Euler angles where the Y angle (rotation about the Y axis) is randomized. The mushroom model contains // LOD levels, so the StaticModel component will automatically select the LOD level according to the view distance (you'll // see the model get simpler as it moves further away). Finally, rendering a large number of the same object with the // same material allows instancing to be used, if the GPU supports it. This reduces the amount of CPU work in rendering the // scene. const unsigned NUM_OBJECTS = 200; for (unsigned i = 0; i < NUM_OBJECTS; ++i) { Node* mushroomNode = scene_->CreateChild("Mushroom"); mushroomNode->SetPosition(Vector3(Random(90.0f) - 45.0f, 0.0f, Random(90.0f) - 45.0f)); mushroomNode->SetScale(0.5f + Random(2.0f)); StaticModel* mushroomObject = mushroomNode->CreateComponent<StaticModel>(); mushroomObject->SetModel(cache->GetResource<Model>("Models/Mushroom.mdl")); mushroomObject->SetMaterial(cache->GetResource<Material>("Materials/Mushroom.xml")); Node* mushroomTitleNode = mushroomNode->CreateChild("MushroomTitle"); mushroomTitleNode->SetPosition(Vector3(0.0f, 1.2f, 0.0f)); Text3D* mushroomTitleText = mushroomTitleNode->CreateComponent<Text3D>(); mushroomTitleText->SetText("Mushroom " + String(i)); mushroomTitleText->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 24); mushroomTitleText->SetColor(Color::RED); if (i % 3 == 1) { mushroomTitleText->SetColor(Color::GREEN); mushroomTitleText->SetTextEffect(TE_SHADOW); mushroomTitleText->SetEffectColor(Color(0.5f, 0.5f, 0.5f)); } else if (i % 3 == 2) { mushroomTitleText->SetColor(Color::YELLOW); mushroomTitleText->SetTextEffect(TE_STROKE); mushroomTitleText->SetEffectColor(Color(0.5f, 0.5f, 0.5f)); } mushroomTitleText->SetAlignment(HA_CENTER, VA_CENTER); } // Create a scene node for the camera, which we will move around // The camera will use default settings (1000 far clip distance, 45 degrees FOV, set aspect ratio automatically) cameraNode_ = scene_->CreateChild("Camera"); cameraNode_->CreateComponent<Camera>(); // Set an initial position for the camera scene node above the plane cameraNode_->SetPosition(Vector3(0.0f, 5.0f, 0.0f)); }
void RibbonTrailDemo::CreateScene() { ResourceCache* cache = GetSubsystem<ResourceCache>(); scene_ = new Scene(context_); // Create octree, use default volume (-1000, -1000, -1000) to (1000, 1000, 1000) scene_->CreateComponent<Octree>(); // Create scene node & StaticModel component for showing a static plane Node* planeNode = scene_->CreateChild("Plane"); planeNode->SetScale(Vector3(100.0f, 1.0f, 100.0f)); StaticModel* planeObject = planeNode->CreateComponent<StaticModel>(); planeObject->SetModel(cache->GetResource<Model>("Models/Plane.mdl")); planeObject->SetMaterial(cache->GetResource<Material>("Materials/StoneTiled.xml")); // Create a directional light to the world. Node* lightNode = scene_->CreateChild("DirectionalLight"); lightNode->SetDirection(Vector3(0.6f, -1.0f, 0.8f)); // The direction vector does not need to be normalized Light* light = lightNode->CreateComponent<Light>(); light->SetLightType(LIGHT_DIRECTIONAL); light->SetCastShadows(true); light->SetShadowBias(BiasParameters(0.00005f, 0.5f)); // Set cascade splits at 10, 50 and 200 world units, fade shadows out at 80% of maximum shadow distance light->SetShadowCascade(CascadeParameters(10.0f, 50.0f, 200.0f, 0.0f, 0.8f)); // Create first box for face camera trail demo with 1 column. boxNode1_ = scene_->CreateChild("Box1"); StaticModel* box1 = boxNode1_->CreateComponent<StaticModel>(); box1->SetModel(cache->GetResource<Model>("Models/Box.mdl")); box1->SetCastShadows(true); RibbonTrail* boxTrail1 = boxNode1_->CreateComponent<RibbonTrail>(); boxTrail1->SetMaterial(cache->GetResource<Material>("Materials/RibbonTrail.xml")); boxTrail1->SetStartColor(Color(1.0f, 0.5f, 0.0f, 1.0f)); boxTrail1->SetEndColor(Color(1.0f, 1.0f, 0.0f, 0.0f)); boxTrail1->SetWidth(0.5f); boxTrail1->SetUpdateInvisible(true); // Create second box for face camera trail demo with 4 column. // This will produce less distortion than first trail. boxNode2_ = scene_->CreateChild("Box2"); StaticModel* box2 = boxNode2_->CreateComponent<StaticModel>(); box2->SetModel(cache->GetResource<Model>("Models/Box.mdl")); box2->SetCastShadows(true); RibbonTrail* boxTrail2 = boxNode2_->CreateComponent<RibbonTrail>(); boxTrail2->SetMaterial(cache->GetResource<Material>("Materials/RibbonTrail.xml")); boxTrail2->SetStartColor(Color(1.0f, 0.5f, 0.0f, 1.0f)); boxTrail2->SetEndColor(Color(1.0f, 1.0f, 0.0f, 0.0f)); boxTrail2->SetWidth(0.5f); boxTrail2->SetTailColumn(4); boxTrail2->SetUpdateInvisible(true); // Load ninja animated model for bone trail demo. Node* ninjaNode = scene_->CreateChild("Ninja"); ninjaNode->SetPosition(Vector3(5.0f, 0.0f, 0.0f)); ninjaNode->SetRotation(Quaternion(0.0f, 180.0f, 0.0f)); AnimatedModel* ninja = ninjaNode->CreateComponent<AnimatedModel>(); ninja->SetModel(cache->GetResource<Model>("Models/NinjaSnowWar/Ninja.mdl")); ninja->SetMaterial(cache->GetResource<Material>("Materials/NinjaSnowWar/Ninja.xml")); ninja->SetCastShadows(true); // Create animation controller and play attack animation. ninjaAnimCtrl_ = ninjaNode->CreateComponent<AnimationController>(); ninjaAnimCtrl_->PlayExclusive("Models/NinjaSnowWar/Ninja_Attack3.ani", 0, true, 0.0f); // Add ribbon trail to tip of sword. Node* swordTip = ninjaNode->GetChild("Joint29", true); swordTrail_ = swordTip->CreateComponent<RibbonTrail>(); // Set sword trail type to bone and set other parameters. swordTrail_->SetTrailType(TT_BONE); swordTrail_->SetMaterial(cache->GetResource<Material>("Materials/SlashTrail.xml")); swordTrail_->SetLifetime(0.22f); swordTrail_->SetStartColor(Color(1.0f, 1.0f, 1.0f, 0.75f)); swordTrail_->SetEndColor(Color(0.2f, 0.5f, 1.0f, 0.0f)); swordTrail_->SetTailColumn(4); swordTrail_->SetUpdateInvisible(true); // Add floating text for info. Node* boxTextNode1 = scene_->CreateChild("BoxText1"); boxTextNode1->SetPosition(Vector3(-1.0f, 2.0f, 0.0f)); Text3D* boxText1 = boxTextNode1->CreateComponent<Text3D>(); boxText1->SetText(String("Face Camera Trail (4 Column)")); boxText1->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 24); Node* boxTextNode2 = scene_->CreateChild("BoxText2"); boxTextNode2->SetPosition(Vector3(-6.0f, 2.0f, 0.0f)); Text3D* boxText2 = boxTextNode2->CreateComponent<Text3D>(); boxText2->SetText(String("Face Camera Trail (1 Column)")); boxText2->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 24); Node* ninjaTextNode2 = scene_->CreateChild("NinjaText"); ninjaTextNode2->SetPosition(Vector3(4.0f, 2.5f, 0.0f)); Text3D* ninjaText = ninjaTextNode2->CreateComponent<Text3D>(); ninjaText->SetText(String("Bone Trail (4 Column)")); ninjaText->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 24); // Create the camera. cameraNode_ = scene_->CreateChild("Camera"); cameraNode_->CreateComponent<Camera>(); // Set an initial position for the camera scene node above the plane cameraNode_->SetPosition(Vector3(0.0f, 2.0f, -14.0f)); }