Beispiel #1
0
void Widget::setTexCoordWrapVertical() {
    osg::Image*   image   = _image();
    osg::Texture* texture = _texture();

    if(!image || !texture || image->t() == 0.0f) return;

    texture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);

    setTexCoord(0.0f, getHeight() / image->t(), UPPER_LEFT);
    setTexCoord(1.0f, getHeight() / image->t(), UPPER_RIGHT);
}
Beispiel #2
0
void Widget::setTexCoordWrapHorizontal() {
    osg::Image*   image   = _image();
    osg::Texture* texture = _texture();

    if(!image || !texture || image->s() == 0.0f) return;

    texture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);

    setTexCoord(getWidth() / image->s(), 0.0f, LOWER_RIGHT);
    setTexCoord(getWidth() / image->s(), 1.0f, UPPER_RIGHT);
}
Beispiel #3
0
bool Widget::setTexture(osg::Texture* texture, bool setTexCoords, bool useTextRect) {
    if(!texture) return false;

    getOrCreateStateSet()->setTextureAttributeAndModes(
        0,
        texture,
        osg::StateAttribute::ON
    );

    if(setTexCoords) {
        if(useTextRect) {
             osg::Image* image = texture->getImage(0);

            setTexCoord(0.0f, 0.0f, LOWER_LEFT);
            setTexCoord(image->s(), 0.0f, LOWER_RIGHT);
            setTexCoord(image->s(), image->t(), UPPER_RIGHT);
            setTexCoord(0.0f, image->t(), UPPER_LEFT);
        }

        else {
            setTexCoord(0.0f, 0.0f, LOWER_LEFT);
            setTexCoord(1.0f, 0.0f, LOWER_RIGHT);
            setTexCoord(1.0f, 1.0f, UPPER_RIGHT);
            setTexCoord(0.0f, 1.0f, UPPER_LEFT);
        }
    }

    return true;
}
Beispiel #4
0
void Triangle2::setTexCoordByVertex(TexCoordNode *texCoord, VertexNode *vertex)
{
    for (unsigned int i = 0; i < count(); i++)
    { 
        if (this->vertex(i) == vertex)
        {
            setTexCoord(i, texCoord);
            break;
        }
    }
}
void GLVertexGridDirect::render()
{
	Vec2 p0, p1;

    for (int j = 0; j < resY - 1; j++)
    {
		glBegin(GL_QUAD_STRIP);
        for (int i = 0; i < resX; i++)
        {
			getPoint(0, i, j, p0);
            getPoint(0, i, j + 1, p1);

			setTexCoord(i, j);
			glVertex2f(p0.x*destW, p0.y*destH);

			setTexCoord(i, j + 1);
			glVertex2f(p1.x*destW, p1.y*destH);
		}
		glEnd();
	}
}
Beispiel #6
0
Triangle2::Triangle2(const vector<VertexNode *> &vertices) :
    selected(false),
    visible(true),
    _isQuad(vertices.size() == 4),
    normalsAreValid(false)
{
    for (unsigned int i = 0; i < count(); i++)
    {
        setVertex(i, vertices[i]);
        setVertexEdge(i, NULL);
        setTexCoord(i, NULL);
        setTexCoordEdge(i, NULL);
    }
}
Beispiel #7
0
Triangle2::Triangle2(VertexNode *vertices[], TexCoordNode *texCoords[], bool isQuad) :
    selected(false),
    visible(true),
    _isQuad(isQuad),
    normalsAreValid(false)
{
    for (unsigned int i = 0; i < count(); i++)
    {
        setVertex(i, vertices[i]);
        setVertexEdge(i, NULL);
        setTexCoord(i, texCoords[i]);
        setTexCoordEdge(i, NULL);
    }
}
Beispiel #8
0
Triangle2::Triangle2() :
    selected(false),
    visible(true),
    _isQuad(false),
    normalsAreValid(false)
{
    for (unsigned int i = 0; i < count(); i++)
    {
        setVertex(i, NULL);
        setVertexEdge(i, NULL);
        setTexCoord(i, NULL);
        setTexCoordEdge(i, NULL);
    }
}
Beispiel #9
0
void Frame::Border::positioned()
{
    osg::Image* image = _image();

    if(!image) return;

    Frame* parent = dynamic_cast<Frame*>(getParent());

    if(!parent || !parent->canTexture()) return;

    point_type w = image->s() / 8.0f;
    point_type h = getHeight();

    if(_border == BORDER_LEFT) setTexCoordRegion(w * 3, 0.0f, w, h);

    else if(_border == BORDER_RIGHT) setTexCoordRegion(w * 4, 0.0f, w, h);

    else if(_border == BORDER_TOP) {
        // TODO: Temporary; fix this.
        point_type tx1 = (w * 2) / image->s();
        point_type tx2 = w / image->s();
        point_type tx3 = getWidth() / w;

        setTexCoord(tx1, tx3,  LL);
        setTexCoord(tx1, 0.0f, LR);
        setTexCoord(tx2, 0.0f, UR);
        setTexCoord(tx2, tx3,  UL);
    }

    else {
        point_type tx1 = (w * 7) / image->s();
        point_type tx2 = (w * 6) / image->s();
        point_type tx3 = getWidth() / w;

        setTexCoord(tx1, tx3,  LL);
        setTexCoord(tx1, 0.0f, LR);
        setTexCoord(tx2, 0.0f, UR);
        setTexCoord(tx2, tx3,  UL);
    }
}
Beispiel #10
0
Mesh::Mesh(Object *parent, const char *fileName, Game::Surface *texture, int _flags):
    Object(parent),
    vertexCount(0),
    faceCount(0),
    currentFace(0),
    currentVertex(0),
    vertex(0),
    transformedVertex(0),
    face(0),
    flags(_flags)
{
    transformation.makeIdentity();
    TagFile file(fileName);
    int i;

    beginMesh();

    while(1)
        switch(file.readTag())
        {
        case 0: // list of vertices
        {
            vertexCount = file.getDataSize() / sizeof(SerializedVertex);
            SerializedVertex *v = new SerializedVertex[vertexCount];

            vertex = new Vertex[vertexCount];
            transformedVertex = new Vertex[vertexCount];

            file.readData((unsigned char*)v, sizeof(SerializedVertex)*vertexCount);

            for(i=0; i<vertexCount; i++)
            {
                setTexCoord(v[i].u, v[i].v);
                //                  addVertex(Vector(v[i].x >> 1, v[i].y >> 1, v[i].z >> 1));
                addVertex(Vector(v[i].x, v[i].y, v[i].z));
            }

            delete[] v;
        }
        break;
        case 1: // list of faces
        {
            faceCount = file.getDataSize() / sizeof(SerializedTriangle);
            SerializedTriangle *t = new SerializedTriangle[faceCount];

            face = new Face[faceCount];

            file.readData((unsigned char*)t, sizeof(SerializedTriangle)*faceCount);

            for(i=0; i<faceCount; i++)
            {
                beginFace(3);
                setTexture(texture);
                addFaceVertex(t[i].a);
                addFaceVertex(t[i].b);
                addFaceVertex(t[i].c);
                endFace();
            }

            delete[] t;
        }
        break;
        default:
            endMesh();
            return;
        }
}
Beispiel #11
0
        void WarpGrid::update()
        {
            if(!circle_) {
                circle_.reset(new Circle());
            }

            if (!warpGrid_.hasChanged()) {
                return;
            }

            vertexVbo_.gen();
            indexVbo_.gen();
            gridVertexVbo_.gen();
            gridIndexVbo_.gen();

            size_t _resX        = subdivisions() * (warpGrid_.horizontal() - 1) + 1;
            size_t _resY        = subdivisions() * (warpGrid_.vertical() - 1) + 1;
            size_t _numVertices = _resX * _resY;
            bool _resized = vertices_.size() != _numVertices;

            if (_resized) {
                vertices_.clear();
                vertices_.resize(_numVertices);
                indices_.clear();
                indices_.resize(4 * _numVertices);

                gridVertices_.clear();
                size_t _num = (2*subdivisions()) * warpGrid_.horizontal() * warpGrid_.vertical();
                gridVertices_.resize(_num);
                gridIndices_.clear();
                gridIndices_.resize(_num*2);
            }

            auto _vertexIt = vertices_.begin();
            auto _indexIt = indices_.begin();

            for (size_t x = 0; x < _resX; ++x) {
                for (size_t y = 0; y < _resY; ++y) {
                    // index
                    if (_resized) {
                        if (((x + 1) < _resX) && ((y + 1) < _resY)) {
                            *(_indexIt++) = (x + 0) * _resY + (y + 0);
                            *(_indexIt++) = (x + 1) * _resY + (y + 0);
                            *(_indexIt++) = (x + 1) * _resY + (y + 1);
                            *(_indexIt++) = (x + 0) * _resY + (y + 1);
                        }

                        // texCoords
                        float tx = x / (float)(_resX - 1);
                        float ty = y / (float)(_resY - 1);
                        _vertexIt->setTexCoord(QVector2D(tx, 1.0 - ty));
                    }

                    // transform coordinates to [0..numControls]
                    float u = x * (warpGrid_.horizontal() - 1) /
                            (float)(_resX - 1);
                    float v = y * (warpGrid_.vertical() - 1) /
                            (float)(_resY - 1);

                    // determine col and row
                    int _col = (int)(u);
                    int _row = (int)(v);

                    // normalize coordinates to [0..1]
                    u -= _col;
                    v -= _row;

                    _vertexIt->setPos(warpGrid_.getWarpPointPos(_col,_row,u,v));
                    ++_vertexIt;
                }
            }

            /// Generate grid
            auto _gridVertexIt = gridVertices_.begin();
            auto _gridIndexIt = gridIndices_.begin();

            // Generate horizontal lines
            size_t i = 0;
            for (size_t y = 0; y < _resY; y += subdivisions()) {
                for (size_t x = 0; x < _resX; ++x) {
                    *(_gridVertexIt++) = vertices_[x*_resY + y].pos();
                    if (x < _resX-1) {
                    *(_gridIndexIt++) = i;
                        *(_gridIndexIt++) = i+1;
                    }
                    ++i;
                }
            }

            // Generate vertical lines
            for (size_t x = 0; x < _resX; x += subdivisions()) {
                for (size_t y = 0; y < _resY; ++y) {
                    *(_gridVertexIt++) = vertices_[x*_resY + y].pos();
                    if (y < _resY-1) {
                    *(_gridIndexIt++) = i;
                        *(_gridIndexIt++) = i+1;
                    }
                    ++i;
                }
            }

            vertexVbo_.bufferStaticArray(vertices_);
            indexVbo_.bufferStaticElementArray(indices_);

            gridVertexVbo_.bufferStaticArray(gridVertices_);
            gridIndexVbo_.bufferStaticElementArray(gridIndices_);
        }