working version of 3d Asset Viewer

-----------------------------------------
-- Models
-- Written by John Millard
-----------------------------------------
-- Description:
-- Domonstrates model loading in Craft.
-----------------------------------------

Tag = class()

function Tag:init(entity, name)
    self.entity = entity
    self.name = name
end

-- Use this function to perform your initial setup
function setup()
    PrintExplanation()
    
    scene = craft.scene()
    
    packs = 
    {
        "Blocky Characters",
        "Watercraft",
        "RacingKit",
        "SpaceKit",
        "CastleKit",
        "Primitives",
        "Nature"
    }
    
    -- Setup camera and lighting    
    scene.ambientColor = color(61, 61, 61, 255)
    scene.sun:get(craft.light).intensity = 1.0
    scene.sun.rotation = quat.eulerAngles(-45, 125, 0)
    scene.sky.active = false
    
    viewer = scene.camera:add(OrbitViewer, vec3(0,0,0), 75, 10, 200)
    viewer.ry = 225
    viewer.rx = 45
    
    AssetPack = 1
    loadModels(packs[AssetPack])        
    
    parameter.watch("packs[AssetPack]")     
    parameter.action("Next Pack", function()
        AssetPack = math.min(AssetPack+1, #packs)
        loadModels(packs[AssetPack])        
    end)    
    parameter.action("Previous Pack", function()
        AssetPack = math.max(AssetPack-1, 1)
        loadModels(packs[AssetPack])        
    end)        
    parameter.boolean("ShowBounds", false)    
    
end

function shortname(name)
    local rev = name:reverse()
    local i = rev:find(".", 1, true) or rev:len()
    local s = rev:sub(i+1)
    return s:reverse()
end

function getModels(pack)
    pack = string.gsub(pack, " ", "_")
    local a = asset.builtin[pack].all or {}
    local models = {}
    for k,v in pairs(a) do
        local n = shortname(v.name)
        if v.type == MODELS then
            table.insert(models,n)
        end
    end
    return models
end

function loadModels(pack)
    
    --assets = assetList(pack, "models")
    assets = getModels(pack)
    
    if models then
        for k,v in pairs(models) do
            v:destroy()
        end
    end
    
    -- Load models
    models = {}   
    for k,v in pairs(assets) do    
        local model = scene:entity()
        
        local mr = model:add(craft.renderer)  
        mr.model = craft.model(pack..":"..v)

        -- Tag the model for later
        model:add(Tag, pack..":"..v)
        
        table.insert(models, model)
    end
    
    local x, z = 0,0
    local maxRowDepth = 0
    local center = vec3()
    
    for k,model in pairs(models) do    
        local mr = model:get(craft.renderer)  

        local bounds = mr.model.bounds
        
        model.x = x - bounds.max.x
        model.z = z - bounds.offset.z
        x = x - bounds.size.x - 2
        
        maxRowDepth = math.max(maxRowDepth, bounds.size.z)
        
        if x < -120 then
            x = 0
            z = z + maxRowDepth + 2
            maxRowDepth = 0
        end
        
        center = center + model.position 
    end
    
    center = center / #models
    
    viewer.target = center
end

function updateViewer()
    local m = models[ModelNumber]
    local b = m:get(craft.renderer).model.bounds
    viewer.target = m.position + b.center
end

function update(dt)
    scene:update(dt)

    if ShowBounds then
        for k,v in pairs(models) do    
            local b = v:get(craft.renderer).model.bounds
            b2 = bounds(b.min, b.max)
            b2:translate(v.position)
            scene.debug:bounds(b2, color(255,255,255,255))
        end
    end
    
end
    

-- This function gets called once every frame
function draw()
    update(DeltaTime)
    
    scene:draw()
end

function PrintExplanation()
    output.clear()
    print("Loading models is easy, simply create an entity and add a renderer component.")
    print("Set the mesh using craft.model(asset)")
    print("In this example we have used assetList to get all models from each asset pack")
    print("Models will try to load a material if there is one, otherwise a blank material will be used.")
end

@RonJeffries I don’t think you need any help with asset. You did a great job of fixing this.

right. so far so good. i’m reporting issues with the system, because the docs ought to be better.

@RonJeffries I’m looking over you code and I’m having trouble with MODELS. Where is that being defined as models at.

@RonJeffries great job figuring out the new API. Sorry the docs weren’t sufficient and that I had missed updating this example

Here’s how it will be updated for the next version of Codea:

https://gist.github.com/TwoLivesLeft/a751d1ae6b1e77f5271ea0c4ccd00500

makes sense, certainly. better than what i did.