Browse Source

Port HugeObjectCount to lua.

Aster Jian 12 years ago
parent
commit
699b9b29be

+ 3 - 3
Bin/Data/LuaScripts/01_HelloWorld.lua

@@ -1,8 +1,8 @@
 -- This first example, maintaining tradition, prints a "Hello World" message.
 -- This first example, maintaining tradition, prints a "Hello World" message.
 -- Furthermore it shows:
 -- Furthermore it shows:
---     - Using the Sample utility functions as a base for the application
---     - Adding a Text element to the graphical user interface
---     - Subscribing to and handling of update events
+--     - Using the Sample utility functions as a base for the application;
+--     - Adding a Text element to the graphical user interface;
+--     - Subscribing to and handling of update events;
 
 
 require "LuaScripts/Utilities/Sample"
 require "LuaScripts/Utilities/Sample"
 
 

+ 10 - 10
Bin/Data/LuaScripts/02_HelloGUI.lua

@@ -1,27 +1,31 @@
 -- A simple 'HelloWorld' GUI created purely from code.
 -- A simple 'HelloWorld' GUI created purely from code.
 -- This sample demonstrates:
 -- This sample demonstrates:
---     - Creation of controls and building a UI hierarchy
---     - Loading UI style from XML and applying it to controls
---     - Handling of global and per-control events
+--     - Creation of controls and building a UI hierarchy;
+--     - Loading UI style from XML and applying it to controls;
+--     - Handling of global and per-control events;
 
 
 require "LuaScripts/Utilities/Sample"
 require "LuaScripts/Utilities/Sample"
 
 
 local window = nil
 local window = nil
 
 
+local context = GetContext()
+
+local cache = GetCache()
+local engine = GetEngine()
+local input = GetInput()
+local ui = GetUI()
+    
 function Start()
 function Start()
     -- Execute the common startup for samples
     -- Execute the common startup for samples
     SampleStart()
     SampleStart()
 
 
     -- Enable OS cursor
     -- Enable OS cursor
-    local input = GetInput()
     input.mouseVisible = true
     input.mouseVisible = true
 
 
     -- Load XML file containing default UI style sheet
     -- Load XML file containing default UI style sheet
-    local cache = GetCache()
     local style = cache:GetResource("XMLFile", "UI/DefaultStyle.xml")
     local style = cache:GetResource("XMLFile", "UI/DefaultStyle.xml")
 
 
     -- Set the loaded style as default style
     -- Set the loaded style as default style
-    local ui = GetUI()
     ui.root.defaultStyle = style
     ui.root.defaultStyle = style
 
 
     -- Initialize Window
     -- Initialize Window
@@ -38,7 +42,6 @@ end
 
 
 function InitControls()
 function InitControls()
     -- Create a CheckBox
     -- Create a CheckBox
-    local context = GetContext()
     local checkBox = CheckBox:new(context)
     local checkBox = CheckBox:new(context)
     checkBox:SetName("CheckBox")
     checkBox:SetName("CheckBox")
 
 
@@ -65,9 +68,7 @@ end
 
 
 function InitWindow()
 function InitWindow()
     -- Create the Window and add it to the UI's root node
     -- Create the Window and add it to the UI's root node
-    local context = GetContext()
     window = Window:new(context)
     window = Window:new(context)
-    local ui = GetUI()
     ui.root:AddChild(window)
     ui.root:AddChild(window)
     
     
     -- Set Window size and layout settings
     -- Set Window size and layout settings
@@ -115,7 +116,6 @@ function SubscribeToEvents()
 end
 end
 
 
 function HandleClosePressed(eventType, eventData)
 function HandleClosePressed(eventType, eventData)
-    local engine = GetEngine()
     engine:Exit()
     engine:Exit()
 end
 end
 
 

+ 165 - 0
Bin/Data/LuaScripts/20_HugeObjectCount.lua

@@ -0,0 +1,165 @@
+-- Huge object count example.
+-- This sample demonstrates:
+--     - Creating a scene with 250 x 250 simple objects;
+--     - Competing with http://yosoygames.com.ar/wp/2013/07/ogre-2-0-is-up-to-3x-faster/ :);
+--     - Allowing examination of performance hotspots in the rendering code;
+
+require "LuaScripts/Utilities/Sample"
+
+local scene_
+local cameraNode
+local boxNodes = {}
+local yaw = 0.0
+local pitch = 0.0
+local animate = false
+
+local context = GetContext()
+local cache = GetCache()
+local input = GetInput()
+local renderer = GetRenderer()
+local ui = GetUI()
+
+function Start()
+    -- Execute the common startup for samples
+    SampleStart()
+
+    -- Create the scene content
+    CreateScene()
+
+    -- Create the UI content
+    CreateInstructions()
+
+    -- Setup the viewport for displaying the scene
+    SetupViewport()
+
+    -- Hook up to the frame update events
+    SubscribeToEvents()
+end
+
+function CreateScene()
+    scene_ = Scene(context)
+
+    -- Create the Octree component to the scene so that drawable objects can be rendered. Use default volume
+    -- (-1000, -1000, -1000) to (1000, 1000, 1000)
+    scene_:CreateComponent("Octree")
+
+    -- Create a Zone for ambient light & fog control
+    local zoneNode = scene_:CreateChild("Zone")
+    local zone = zoneNode:CreateComponent("Zone")
+    zone.boundingBox = BoundingBox(-1000.0, 1000.0)
+    zone.fogColor = Color(0.2, 0.2, 0.2)
+    zone.fogStart = 200.0
+    zone.fogEnd = 300.0
+    
+    -- Create a directional light
+    local lightNode = scene_:CreateChild("DirectionalLight")
+    lightNode.direction = Vector3(0.5, -1.0, 0.5) -- The direction vector does not need to be normalized
+    local light = lightNode:CreateComponent("Light")
+    light.lightType = LIGHT_DIRECTIONAL
+    light.color = Color(0.7, 0.35, 0.0)
+
+    -- Create box StaticModels in the scene
+    for y = -125, 125 do
+        for x = -125, 125 do
+            local boxNode = scene_:CreateChild("Box")
+            boxNode.position = Vector3(x * 0.3, 0.0, y * 0.3)
+            boxNode:SetScale(0.25)
+            local boxObject = boxNode:CreateComponent("StaticModel")
+            boxObject.model = cache:GetResource("Model", "Models/Box.mdl")
+            table.insert(boxNodes, boxNode)
+        end
+    end
+
+    -- Create the camera
+    cameraNode = scene_:CreateChild("Camera")
+    cameraNode.position = Vector3(0.0, 10.0, -100.0)
+    local camera = cameraNode:CreateComponent("Camera")
+    camera.farClip = 300.0
+end
+
+function CreateInstructions()
+    -- Construct new Text object, set string to display and font to use
+    local instructionText = ui.root:CreateChild("Text")
+    instructionText:SetText("Use WASD keys and mouse to move\n"..
+        "Space to toggle animation")
+    instructionText:SetFont(cache:GetResource("Font", "Fonts/Anonymous Pro.ttf"), 15)
+    -- The text has multiple rows. Center them in relation to each other
+    instructionText.textAlignment = HA_CENTER
+    
+    -- Position the text relative to the screen center
+    instructionText.horizontalAlignment = HA_CENTER
+    instructionText.verticalAlignment= VA_CENTER
+    instructionText:SetPosition(0, ui.root.height / 4)
+end
+
+function SetupViewport()
+    -- Set up a viewport to the Renderer subsystem so that the 3D scene can be seen
+    local viewport = Viewport:new(context, scene_, cameraNode:GetComponent("Camera"))
+    renderer:SetViewport(0, viewport)
+end
+
+function SubscribeToEvents()
+    -- Subscribe HandleUpdate() function for processing update events
+    SubscribeToEvent("Update", "HandleUpdate")
+end
+
+function MoveCamera(timeStep)
+    -- Do not move if the UI has a focused element (the console)
+    if ui.focusElement ~= nil then
+        return
+    end
+
+    -- Movement speed as world units per second
+    local MOVE_SPEED = 20.0
+    -- Mouse sensitivity as degrees per pixel
+    local MOUSE_SENSITIVITY = 0.1
+
+    -- Use this frame's mouse motion to adjust camera node yaw and pitch. Clamp the pitch between -90 and 90 degrees
+    local mouseMove = input.mouseMove
+    yaw = yaw + MOUSE_SENSITIVITY * mouseMove.x
+    pitch = pitch + MOUSE_SENSITIVITY * mouseMove.y
+    pitch = Clamp(pitch, -90.0, 90.0)
+
+    -- Construct new orientation for the camera scene node from yaw and pitch. Roll is fixed to zero
+    cameraNode.rotation = Quaternion(pitch, yaw, 0.0)
+
+    -- Read WASD keys and move the camera scene node to the corresponding direction if they are pressed
+    if input:GetKeyDown(KEY_W) then
+        cameraNode:TranslateRelative(Vector3(0.0, 0.0, 1.0) * MOVE_SPEED * timeStep)
+    end
+    if input:GetKeyDown(KEY_S) then
+        cameraNode:TranslateRelative(Vector3(0.0, 0.0, -1.0) * MOVE_SPEED * timeStep)
+    end
+    if input:GetKeyDown(KEY_A) then
+        cameraNode:TranslateRelative(Vector3(-1.0, 0.0, 0.0) * MOVE_SPEED * timeStep)
+    end
+    if input:GetKeyDown(KEY_D) then
+        cameraNode:TranslateRelative(Vector3(1.0, 0.0, 0.0) * MOVE_SPEED * timeStep)
+    end
+end
+
+function AnimateObjects(timeStep)
+    local ROTATE_SPEED = 15.0
+    local delta = ROTATE_SPEED * timeStep
+    for i, v in ipairs(boxNodes) do
+        v:Roll(delta)
+    end
+end
+
+function HandleUpdate(eventType, eventData)
+    -- Take the frame time step, which is stored as a float
+    local timeStep = eventData:GetFloat("TimeStep")
+
+    -- Toggle animation with space
+    if input:GetKeyPress(KEY_SPACE) then
+        animate = not animate
+    end
+
+    -- Move the camera, scale movement with time step
+    MoveCamera(timeStep)
+    
+    -- Animate scene if enabled
+    if animate then
+        AnimateObjects(timeStep)
+    end
+end