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); }
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); }
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; }
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(); } }
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); } }
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); } }
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); } }
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); } }
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; } }
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_); }