[SFML] Obliczanie wartości dla ::glScissor
Ostatnio zmodyfikowano 2012-10-07 22:30
ridic14 Temat założony przez niniejszego użytkownika |
[SFML] Obliczanie wartości dla ::glScissor » 2012-10-06 21:25:05 Otóż muszę obliczyć wartość dla ::glScissor ale nie za bardzo mi to wychodzi... mój niedziałający pomysł : ::glScissor( area.getPosition().x, area.getPosition().y + area.getSize().y, area.getSize().x, area.getSize().y );
Funkcja glScissor przyjmuje cztery argumenty i są nimi kolejno:
położenie lewej krawędzi prostokąta obcinającego względem lewej krawędzi okna aplikacji; położenie dolnej krawędzi prostokąta obcinającego względem dolnej krawędzi okna aplikacji; szerokość prostokąta obcinającego; wysokość prostokąta obcinającego. |
czy jest na to jakiś sposób |
|
DejaVu |
» 2012-10-06 21:29:37 Z tego co kojarzę musisz użyć jakiejś funkcji sf::transform (czy coś podobnego) aby przekonwertować współrzędne OpenGL do współrzędnych okna. Dokładnej nazwy funkcji niestety Ci nie przytoczę, bo po prostu nie pamiętam :) W SFML 1.6 taka metoda znajdowała się bodajże w klasie trzymającej okno. |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2012-10-06 21:43:00 |
|
DejaVu |
» 2012-10-06 21:45:05 Nie szukaj rozwiązania na MSDN-ie. Rozwiązanie jest zaimplementowane w bibliotece SFML - musisz tylko znaleźć właściwą funkcję/metodę. |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2012-10-06 21:46:21 Przeszukałem skrypt klasy transform ale tam nie znalazłem nic ciekawego... czas na klasę okna << w przykładach jest coś o gl ale dalej nic nie wywnioskowałem glMatrixMode(GL_PROJECTION); a do czego jest to?: Vector2f RenderTarget::convertCoords( const Vector2i & point, const View & view ) const |
|
DejaVu |
» 2012-10-06 21:49:41 Sprawdź czy istnieje taka metoda w klasie okna :) |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2012-10-06 21:50:22 Tak, ale co oznaczają argumenty |
|
DejaVu |
» 2012-10-06 21:53:29 http://cpp0x.pl/forum/temat/?id=7615Czemu nie sprawdzisz w dokumentacji co oznaczają argumenty tylko się o to pytasz? /edit: http://www.sfml-dev.org/documentation/2.0/classsf_1_1RenderTarget.php#afc047333937f7cb7fe557aec60239233/edit2: W każdym razie to chyba jest konwersja nie w tą stronę, w którą szukasz... :) /edit3: Huh... grzebnąłem w źródłach SFML 2.0: Vector2f RenderTarget::convertCoords( const Vector2i & point, const View & view ) const { Vector2f coords; IntRect viewport = getViewport( view ); coords.x = - 1.f + 2.f *( point.x - viewport.left ) / viewport.width; coords.y = 1.f - 2.f *( point.y - viewport.top ) / viewport.height; return view.getInverseTransform().transformPoint( coords ); }
const Transform & View::getTransform() const { if( !m_transformUpdated ) { float angle = m_rotation * 3.141592654f / 180.f; float cosine = static_cast < float >( std::cos( angle ) ); float sine = static_cast < float >( std::sin( angle ) ); float tx = - m_center.x * cosine - m_center.y * sine + m_center.x; float ty = m_center.x * sine - m_center.y * cosine + m_center.y; float a = 2.f / m_size.x; float b = - 2.f / m_size.y; float c = - a * m_center.x; float d = - b * m_center.y; m_transform = Transform( a * cosine, a * sine, a * tx + c, - b * sine, b * cosine, b * ty + d, 0.f, 0.f, 1.f ); m_transformUpdated = true; } return m_transform; }
const Transform & View::getInverseTransform() const { if( !m_invTransformUpdated ) { m_inverseTransform = getTransform().getInverse(); m_invTransformUpdated = true; } return m_inverseTransform; }
Reasumując, musisz napisać sobie własną funkcję, która będzie wyglądała mniej więcej tak: Vector2f konwertuj( CRenderWindow & view, const Vector2f & coords ) { return view.getTransform().transformPoint( coords ); }
Być może to będzie działało (a być może coś trzeba będzie poprawić). /edit: Poprawiłem: CRenderView => CRenderWindow |
|
« 1 » 2 3 4 |