Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Obliczanie wartości dla ::glScissor

Ostatnio zmodyfikowano 2012-10-07 22:30
Autor Wiadomość
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ł :
C/C++
//sf::RectangleShape area;
::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
P-66225
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.
P-66226
ridic14
Temat założony przez niniejszego użytkownika
» 2012-10-06 21:43:00
na razie mam tylko to: http://msdn.microsoft.com/en-us/library/windows/desktop/dd368581%28v=vs.85%29.aspx ale to nic nie zmienia

ciężko to znaleźć
P-66227
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ę.
P-66228
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
P-66229
DejaVu
» 2012-10-06 21:49:41
Sprawdź czy istnieje taka metoda w klasie okna :)
P-66230
ridic14
Temat założony przez niniejszego użytkownika
» 2012-10-06 21:50:22
Tak, ale co oznaczają argumenty
P-66231
DejaVu
» 2012-10-06 21:53:29
http://cpp0x.pl/forum/temat/?id=7615

Czemu 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:
C/C++
Vector2f RenderTarget::convertCoords( const Vector2i & point, const View & view ) const
{
    // First, convert from viewport coordinates to homogeneous coordinates
    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;
   
    // Then transform by the inverse of the view matrix
    return view.getInverseTransform().transformPoint( coords );
}

C/C++
const Transform & View::getTransform() const
{
    // Recompute the matrix if needed
    if( !m_transformUpdated )
    {
        // Rotation components
        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;
       
        // Projection components
        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;
       
        // Rebuild the projection matrix
        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
{
    // Recompute the matrix if needed
    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:
C/C++
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
P-66232
« 1 » 2 3 4
  Strona 1 z 4 Następna strona