Jump to content

  • Log In with Google      Sign In   
  • Create Account





Unit Testing for Leadwerks 3

Posted by Josh Klint, 28 January 2013 · 619 views

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




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;
}
PARTNERS