예제 #1
0
void Creature::draw(const Point& p, const Rect&)
{
    if(m_showVolatileSquare) {
        g_painter.setColor(m_volatileSquareColor);
        g_painter.drawBoundingRect(Rect(p + m_walkOffset - Point(m_type->parameters[ThingType::DisplacementX], m_type->parameters[ThingType::DisplacementY]) + 3, Size(28, 28)), 2);
    }

    if(m_showStaticSquare) {
        g_painter.setColor(m_staticSquareColor);
        g_painter.drawBoundingRect(Rect(p + m_walkOffset - Point(m_type->parameters[ThingType::DisplacementX], m_type->parameters[ThingType::DisplacementY]) + 1, Size(32, 32)), 2);
    }

    g_painter.setColor(Fw::white);
    if(!outfitProgram) {
        outfitProgram = PainterShaderProgramPtr(new PainterShaderProgram);
        outfitProgram->addShaderFromSourceCode(Shader::Vertex, glslMainWithTexCoordsVertexShader + glslPositionOnlyVertexShader);
        outfitProgram->addShaderFromSourceFile(Shader::Fragment, "/game_shaders/outfit.frag");
        assert(outfitProgram->link());
        outfitProgram->bindUniformLocation(HEAD_COLOR_UNIFORM, "headColor");
        outfitProgram->bindUniformLocation(BODY_COLOR_UNIFORM, "bodyColor");
        outfitProgram->bindUniformLocation(LEGS_COLOR_UNIFORM, "legsColor");
        outfitProgram->bindUniformLocation(FEET_COLOR_UNIFORM, "feetColor");
        outfitProgram->bindUniformLocation(MASK_TEXTURE_UNIFORM, "maskTexture");
    }

    // Render creature
    if(m_outfit.getCategory() == ThingsType::Creature) {
        for(m_yPattern = 0; m_yPattern < m_type->dimensions[ThingType::PatternY]; m_yPattern++) {

            // continue if we dont have this addon.
            if(m_yPattern > 0 && !(m_outfit.getAddons() & (1 << (m_yPattern-1))))
                continue;

            g_painter.setCustomProgram(outfitProgram);

            outfitProgram->bind();
            outfitProgram->setUniformValue(HEAD_COLOR_UNIFORM, m_outfit.getHeadColor());
            outfitProgram->setUniformValue(BODY_COLOR_UNIFORM, m_outfit.getBodyColor());
            outfitProgram->setUniformValue(LEGS_COLOR_UNIFORM, m_outfit.getLegsColor());
            outfitProgram->setUniformValue(FEET_COLOR_UNIFORM, m_outfit.getFeetColor());

            for(int h = 0; h < m_type->dimensions[ThingType::Height]; h++) {
                for(int w = 0; w < m_type->dimensions[ThingType::Width]; w++) {
                    int spriteId = m_type->getSpriteId(w, h, 0, m_xPattern, m_yPattern, m_zPattern, m_animation);
                    if(!spriteId)
                        continue;
                    TexturePtr spriteTex = g_sprites.getSpriteTexture(spriteId);
                    if(!spriteTex)
                        continue;

                    if(m_type->dimensions[ThingType::Layers] > 1) {
                        int maskId = m_type->getSpriteId(w, h, 1, m_xPattern, m_yPattern, m_zPattern, m_animation);
                        TexturePtr maskTex = g_sprites.getSpriteTexture(maskId);
                        outfitProgram->setUniformTexture(MASK_TEXTURE_UNIFORM, maskTex, 1);
                    }

                    Rect drawRect(((p + m_walkOffset).x - w*32) - m_type->parameters[ThingType::DisplacementX],
                                ((p + m_walkOffset).y - h*32) - m_type->parameters[ThingType::DisplacementY],
                                32, 32);
                    g_painter.drawTexturedRect(drawRect, spriteTex);
                }
            }

            g_painter.releaseCustomProgram();
        }
    }
    else if(m_outfit.getCategory() == ThingsType::Item) {
        for(int l = 0; l < m_type->dimensions[ThingType::Layers]; l++)
            internalDraw(p + m_walkOffset, l);
    }
    else if(m_outfit.getCategory() == ThingsType::Effect)
        internalDraw(p + m_walkOffset, 0);
}
예제 #2
0
void ShaderManager::setupItemShader(const PainterShaderProgramPtr& shader)
{
    if(!shader)
        return;
    shader->bindUniformLocation(ITEM_ID_UNIFORM, "u_ItemId");
}
예제 #3
0
void Creature::draw(const Point& p)
{
    // TODO: activate on attack, follow, discover how 'attacked' works
    if(m_showSquareColor) {
        g_painter.setColor(Outfit::getColor(m_squareColor));
        g_painter.drawBoundingRect(Rect(p + m_walkOffset - 8, Size(32, 32)), 2);
    }

    if(!outfitProgram) {
        outfitProgram = PainterShaderProgramPtr(new PainterShaderProgram);
        outfitProgram->addShaderFromSourceCode(Shader::Vertex, glslMainWithTexCoordsVertexShader + glslPositionOnlyVertexShader);
        outfitProgram->addShaderFromSourceFile(Shader::Fragment, "/outfit.frag");
        assert(outfitProgram->link());
        outfitProgram->bindUniformLocation(HEAD_COLOR_UNIFORM, "headColor");
        outfitProgram->bindUniformLocation(BODY_COLOR_UNIFORM, "bodyColor");
        outfitProgram->bindUniformLocation(LEGS_COLOR_UNIFORM, "legsColor");
        outfitProgram->bindUniformLocation(FEET_COLOR_UNIFORM, "feetColor");
        outfitProgram->bindUniformLocation(MASK_TEXTURE_UNIFORM, "maskTexture");
    }

    // Render creature
    for(m_yPattern = 0; m_yPattern < m_type->dimensions[ThingType::PatternY]; m_yPattern++) {

        // continue if we dont have this addon.
        if(m_yPattern > 0 && !(m_outfit.getAddons() & (1 << (m_yPattern-1))))
            continue;

        g_painter.setCustomProgram(outfitProgram);

        outfitProgram->bind();
        outfitProgram->setUniformValue(HEAD_COLOR_UNIFORM, m_outfit.getHeadColor());
        outfitProgram->setUniformValue(BODY_COLOR_UNIFORM, m_outfit.getBodyColor());
        outfitProgram->setUniformValue(LEGS_COLOR_UNIFORM, m_outfit.getLegsColor());
        outfitProgram->setUniformValue(FEET_COLOR_UNIFORM, m_outfit.getFeetColor());

        for(int yi = 0; yi < m_type->dimensions[ThingType::Height]; yi++) {
            for(int xi = 0; xi < m_type->dimensions[ThingType::Width]; xi++) {
                int sprIndex = ((((((m_animation % m_type->dimensions[ThingType::AnimationPhases])
                                * m_type->dimensions[ThingType::PatternZ] + m_zPattern)
                                * m_type->dimensions[ThingType::PatternY] + m_yPattern)
                                * m_type->dimensions[ThingType::PatternX] + m_xPattern)
                                * m_type->dimensions[ThingType::Layers] + 0)
                                * m_type->dimensions[ThingType::Height] + yi)
                                * m_type->dimensions[ThingType::Width] + xi;
                if(m_type->dimensions[ThingType::Layers] > 1) {
                    int maskIndex = ((((((m_animation % m_type->dimensions[ThingType::AnimationPhases])
                                    * m_type->dimensions[ThingType::PatternZ] + m_zPattern)
                                    * m_type->dimensions[ThingType::PatternY] + m_yPattern)
                                    * m_type->dimensions[ThingType::PatternX] + m_xPattern)
                                    * m_type->dimensions[ThingType::Layers] + 1)
                                    * m_type->dimensions[ThingType::Height] + yi)
                                    * m_type->dimensions[ThingType::Width] + xi;
                    int spriteId = m_type->sprites[maskIndex];
                    if(!spriteId)
                        continue;
                    TexturePtr maskTex = g_sprites.getSpriteTexture(spriteId);
                    outfitProgram->setUniformTexture(MASK_TEXTURE_UNIFORM, maskTex, 1);
                }

                int spriteId = m_type->sprites[sprIndex];
                if(!spriteId)
                    continue;

                TexturePtr spriteTex = g_sprites.getSpriteTexture(spriteId);

                Rect drawRect(((p + m_walkOffset).x - xi*32) - m_type->parameters[ThingType::DisplacementX],
                            ((p + m_walkOffset).y - yi*32) - m_type->parameters[ThingType::DisplacementY],
                            32, 32);
                g_painter.drawTexturedRect(drawRect, spriteTex);
            }
        }

        g_painter.releaseCustomProgram();
    }
}