Jump to content

- - - - -

Unit Testing for Leadwerks 3



4: Adsense

I've spent the last few days writing simple examples for every single command in Leadwerks 3. Not only does this make the documentation more friendly, it also acts as a final test to make sure all the commands work the way they say they should. I make the C++ example and then Chris converts it to Lua (and tells me what I did wrong!).

I didn't realize it at first, but this really showcases the strength of API design of Leadwerks. Since you get full control over the execution and flow of a Leadwerks program, it's easy to learn from simple examples that demonstrate one idea. Below are a few examples for different commands in the API.

Get the device accellerometer reading:
#include "App.h"

using namespace Leadwerks;

Window* window = NULL;
Context* context = NULL;

bool App::Start()
{
    window = Window::Create();
    context = Context::Create(window);
    return true;
}

bool App::Continue()
{
    if (window->Closed() || window->KeyDown(Key::Escape)) return false;

    Draw::SetColor(0,0,0);
    context->Clear();

    //Display the device information on the screen
    Draw::SetBlendMode(Blend::Alpha);
    Draw::SetColor(1,1,1);
    Draw::Text("Orientation: "+String(Device::GetOrientation()),2,2);
    Draw::Text("Acceleration: "+Device::GetAcceleration().ToString(),2,22);
    Draw::SetBlendMode(Blend::Solid);

    context->Sync();        
    return true;
}
Create a physics shape from a model and use it on a scaled entity Posted Image :
#include "App.h"

using namespace Leadwerks;

Window* window = NULL;
Context* context = NULL;
World* world = NULL;
Camera* camera = NULL;

bool App::Start()
{
    window = Window::Create();
    context = Context::Create(window);
    world = World::Create();
    camera = Camera::Create();
    camera->SetRotation(35,0,0);
    camera->Move(0,0,-10);
    Light* light = DirectionalLight::Create();
    light->SetRotation(35,35,0);

    //Create the ground
    Model* ground = Model::Box(10,1,10);
    ground->SetPosition(0,-0.5,0);
    ground->SetColor(0,1,0);

    //Create a shape
    Shape* shape = Shape::Box(0,0,0, 0,0,0, 10,1,10);
    ground->SetShape(shape);
    shape->Release();

    //Load a model
    Model* model = Model::Load("Models/teapot.mdl");
    model->SetPosition(0,0,0);
    model->SetColor(0,0,1);
    model->SetScale(4,4,4);

    //Create a shape
    shape = Shape::PolyMesh(model->GetSurface(0));
    model->SetShape(shape);
    model->SetPosition(0,0,0);
    shape->Release();

    //Create some objects to fall
    model = Model::Sphere();
    shape = Shape::Sphere();
    model->SetShape(shape);
    shape->Release();
    model->SetMass(1);
    model->SetColor(Math::Rnd(0,1),Math::Rnd(0,1),Math::Rnd(0,1));
    model->SetPosition(Math::Rnd(-1,1),Math::Rnd(3,6),Math::Rnd(-1,1));

    for (int i=0; i<10; i++)
    {
        model = (Model*)model->Instance();
        model->SetCollisionType(Collision::Prop);
        model->SetColor(Math::Rnd(0,1),Math::Rnd(0,1),Math::Rnd(0,1));
        model->SetPosition(Math::Rnd(-1,1),5+i*2,Math::Rnd(-1,1));
    }

    return true;
}

bool App::Continue()
{
    if (window->Closed() || window->KeyDown(Key::Escape)) return false;

    Time::Update();
    world->Update();
    world->Render();
    context->Sync();

    return true;
}
Create a texture from scratch:
#include "App.h"

using namespace Leadwerks;

Window* window = NULL;
Context* context = NULL;
World* world = NULL;
Texture* texture = NULL;

bool App::Start()
{
    window = Window::Create();
    context = Context::Create(window);

    //Create a texture
    texture = Texture::Create(256,256);

    //Set the texture pixel data
    char* pixels = (char*)malloc(texture->GetMipmapSize(0));
    char r,g,b;
    for (int x=0; x<256; x++)
    {
        for (int y=0; y<256; y++)
        {
            int p = (x*texture->GetWidth() + y)*4;
            memcpy(&r,pixels + p + 0, 1);
            memcpy(&g,pixels + p + 1, 1);
            memcpy(&b,pixels + p + 2, 1);
            if (x<128)
            {
                if (y<128)
                {
                    r=0; g=0; b=255;
                }
                else
                {
                    r=255; g=0; b=0;
                }
            }
            else
            {
                if (y<128)
                {
                    r=255; g=0; b=0;
                }
                else
                {
                    r=0; g=0; b=255;
                }                
            }
            memcpy(pixels + p + 0, &r, 1);
            memcpy(pixels + p + 1, &g, 1);
            memcpy(pixels + p + 2, &b, 1);
        }
    }
    texture->SetPixels(pixels);

    return true;
}

bool App::Continue()
{
    if (window->Closed() || window->KeyDown(Key::Escape)) return false;

    Draw::SetColor(0,0,0);
    context->Clear();

    //Display the texture on screen
    Draw::SetColor(1,1,1);
    Draw::Image(texture,0,0);

    context->Sync();        
    return true;
}
http://www.leadwerks.com

Jan 30 2013 12:18 AM
We got some good feedback on the basic API. It now looks like this:
#include "App.h"

using namespace Leadwerks;

App::App() : window(NULL), context(NULL), world(NULL), camera(NULL) {}

App::~App()
{
    delete world;
    delete window;
}

bool App::Start()
{
    window = Window::Create();
    context = Context::Create(window);
    return true;
}

bool App::Continue()
{
    if (window->Closed() || window->KeyDown(Key::Escape)) return false;

    context->SetColor(0,0,0);
    context->Clear();
    context->SetColor(0,1,0);
    context->DrawRect(0,0,100,100);

    context->Sync();        
    return true;
}

Note: GameDev.net moderates comments.