DrawPolySimple 4998 11

O temacie

Autor ForKing

Zaczęty 26.01.2018 roku

Wyświetleń 4998

Odpowiedzi 11

ForKing

ForKing

Użytkownicy
posty7
Profesjabrak
  • Użytkownicy
Witam, ostatnio przeglądając na dissemblerze pliki Gothica trafiłem na klasę zCRenderer, przejrzałem ją sobie i zainteresowała mnie ta metoda.

.text:0064A000 ; public: virtual void __thiscall zCRenderer::DrawPolySimple(class zCTexture *, struct zTRndSimpleVertex *, int)
void CGame::render()
{
if (!m_vertex)
{
zSTRING string("MENU_INGAME.TGA");
m_pTexture = zCTexture::Load(string, 1);

m_vertex = new zTRndSimpleVertex;

m_vertex[0].pos = zVEC2(300, 300);
m_vertex[1].pos = zVEC2(300, 800);
m_vertex[2].pos = zVEC2(800, 800);
m_vertex[3].pos = zVEC2(800, 300);

m_vertex[0].uv = zVEC2(0, 1);
m_vertex[1].uv = zVEC2(1, 0);
m_vertex[2].uv = zVEC2(1, 0);
m_vertex[3].uv = zVEC2(0, 1);

m_vertex[0].color =
m_vertex[1].color =
m_vertex[2].color =
m_vertex[3].color = zCOLOR(255, 0, 0);
}

if (m_vertex) g_pRender->DrawPolySimple(m_pTexture, m_vertex, 4);
}

Próbowałem jej użyć w mniej więcej taki sposób, ale nie widzę na ekranie żadnego efektu. Jakieś pomysły co mogłem zrobić źle? :hmmm:
 

Cruc

Cruc

Użytkownicy
posty667
Propsy236
Profesjabrak
  • Użytkownicy
DrawPolySimple jest metodą wirtualną. Nic więc dziwnego, że brak jakiegokolwiek efektu.

virtual void DrawPolySimple (zCTexture *texture, zTRndSimpleVertex *vertex, int numVert) {};
Spróbuj to wywołać poprzez klasę zCCamera.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

ForKing

ForKing

Użytkownicy
posty7
Profesjabrak
  • Użytkownicy
Zapowiedziałem powiedzieć że, używam headerów AST, co na 99% eliminuje ten problem. :lol:
 

Cruc

Cruc

Użytkownicy
posty667
Propsy236
Profesjabrak
  • Użytkownicy
Ale ciało metody w klasie zCRenderer jest puste, więc nie wiem jaki sposobem miałoby się coś dziać.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

ForKing

ForKing

Użytkownicy
posty7
Profesjabrak
  • Użytkownicy

ForKing

DrawPolySimple
#4 2018-01-26, 22:42(Ostatnia zmiana: 2018-01-26, 23:35)
Ponieważ istnieje drugie DrawPolySimple w klasie, z której zdaje się dziedziczy zCRenderer.

Spoiler

#Edit

Spoiler

Ok, zrobiłem sobie hooka i spróbowałem dorzucić do kodu:

m_vertex[0].z = 1;
m_vertex[1].z = 1;
m_vertex[2].z = 1;
m_vertex[3].z = 1;

Ostatecznie moja tekstura się renderuje z tym, że mam kolejny problem. Podczas ruchu tekstura "zanika", np. z kwadratu robi się trójkąt. Jakieś pomysły na solucję?

Spoiler
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
O kurwa ktoś pyta o AST xD W wersji Union pojawi się klasa CViewSample którą będzie można manipulować teksturami.
Spróbuj użyć zrenderer->DrawPolySimple. Jeżeli to nie pomoże to wyłącz DepthBuffe a po wywołaniu DrawPolySimple włącz go ponownie.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

ForKing

ForKing

Użytkownicy
posty7
Profesjabrak
  • Użytkownicy

ForKing

DrawPolySimple
#6 2018-01-26, 23:47(Ostatnia zmiana: 2018-01-27, 00:11)
IDirect3DDevice7*& device = *(IDirect3DDevice7**)0x009FC9F4;

device->SetRenderState(D3DRENDERSTATETYPE::D3DRENDERSTATE_ZENABLE, FALSE);
zrenderer->DrawPolySimple(m_pTexture, m_vertex, 4);
device->SetRenderState(D3DRENDERSTATETYPE::D3DRENDERSTATE_ZENABLE, TRUE);

Spróbowałem w ten sposób, ale tekstura i tak zaczyna znikać po tym jak zacznę zmieniać pozycję kamery.  :/

#Edit

Co do DrawSimple z klasy zCCamera...

void CGame::render()
{
    zCCamera * pCamera = g_pCGame->GetCamera();

    if (pCamera)
    {
        static zCCamera::zTCamVertSimple * pVertex = nullptr;
       
        if (pVertex == nullptr)
        {
            pVertex = new zCCamera::zTCamVertSimple;

            pVertex[0].color =
                pVertex[1].color =
                pVertex[2].color =
                pVertex[3].color = zCOLOR(255, 0, 0, 255);

            pVertex[0].texuv = zVEC2(0, 0);
            pVertex[1].texuv = zVEC2(1, 0);
            pVertex[2].texuv = zVEC2(0, 1);
            pVertex[3].texuv = zVEC2(0, 1);

            pVertex[0].x = 50.0;
            pVertex[0].y = 50.0;
            pVertex[0].z = 0.0;
               
            pVertex[1].x = 50.0;
            pVertex[1].y = 250.0;
            pVertex[1].z = 0.0;

            pVertex[2].x = 250.0;
            pVertex[2].y = 250.0;
            pVertex[2].z = 0.0;

            pVertex[3].x = 250.0;
            pVertex[3].y = 50.0;
            pVertex[3].z = 0.0;
        }

        static zCMaterial * pMaterial = nullptr;

        if (pMaterial == nullptr)
        {
            pMaterial = new zCMaterial;

            zSTRING string("MENU_INGAME.TGA");
            pMaterial->SetDetailTexture(zCTexture::Load(string, 0));
            pMaterial->SetTexScale(zVEC2(5.0, 1.0));
            pMaterial->SetTexAniMappingDir(zVEC2(1.0, 1.0));

            pMaterial->color = zCOLOR(255, 0, 0, 255);
        }

        pCamera->DrawPolySimple(pVertex, 4, pMaterial, 1);
    }
}

Spróbowałem tak, niby coś się wyświetla, ale tak samo jak poprzednio przy przemieszczeniu obraz zaczyna zanikać.  :hmmm:
 

Cruc

Cruc

Użytkownicy
posty667
Propsy236
Profesjabrak
  • Użytkownicy
Szczerze mówiąc wątpię, że to jest to, ale niby lepszy rydz niż nic... Pierwsze o czym pomyślałem to, że tekstura ma wciąż ustawiony taki sam obrót, więc po zmianie kamery robi się coś takiego.

W każdym razie łatwo można zweryfikować tą tezę powracając kamerą do początkowego ustawienia.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Na PC mam kod źródłowy CViewSample, jednak nie mam do niego obecnie dostępu. Jeżeli do srody3 nie ukaże sie Union to wysle fragment kodu na TM.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

ForKing

ForKing

Użytkownicy
posty7
Profesjabrak
  • Użytkownicy

ForKing

DrawPolySimple
#9 2018-01-27, 01:21(Ostatnia zmiana: 2018-01-27, 18:34)
Szczerze mówiąc wątpię, że to jest to, ale niby lepszy rydz niż nic... Pierwsze o czym pomyślałem to, że tekstura ma wciąż ustawiony taki sam obrót, więc po zmianie kamery robi się coś takiego.

W każdym razie łatwo można zweryfikować tą tezę powracając kamerą do początkowego ustawienia.

To jest efekt używania Draw z zCCamera:
Spoiler

@up
Dzięki, ale do tej pory pewnie już sam coś też wymyśle, znając życie brakuje mi czegoś głupiego.(jak to zwykle bywa)  :lol:

W sumie na początku miałem w zamiarze spróbować przez directx, ale jak zobaczyłem, że to jest wersja 7 to mi się mocno odechciało. Może muszę wrócić do tego pomysłu.  :D

#Edit

Spróbowałem wyrysować dwa obiekty, efekt jest taki, że obiekt 1 wyświetla się ciągle(tyle, że traci "kolor"), a kolejny zanika?
Spoiler

#Edit2
Ostatecznie metodą prób udało mi się wyeliminować ten błąd, teraz została jeszcze jedna rzecz, która mocno mnie uwiera. Mianowicie, "migotania". Co jakiś czas moje tekstury, znikają na 0.5s i się pojawiają. No ale chyba z tym też sobie jakoś  radę dam.  :pokerface:

Spoiler

#Edit3
Udało mi się wyeliminować migotania poprzez manipulację wartością "z", która jest chyba czymś w rodzaju z-index, z CSS.
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
W View Sample metoda Blit wyglądała tak:
zrenderer->SetZBufferCompare (zRND_ZBUFFER_CMP_ALWAYS);
zrenderer->SetBilerpFilterEnabled (TRUE);
zrenderer->SetAlphaBlendFunc (alphafunc);
zrenderer->DrawPolySimple (texture, m_lstVertices.GetVector(), m_lstVertices.GetNum());
Gdzie m_lstVertices to CArray z zTRndSimpleVertex.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

ForKing

ForKing

Użytkownicy
posty7
Profesjabrak
  • Użytkownicy

ForKing

DrawPolySimple
#11 2018-01-28, 18:01(Ostatnia zmiana: 2018-01-30, 00:36)
zrenderer->SetZBufferCompare(zRND_ZBUFFER_CMP_ALWAYS);
zrenderer->SetBilerpFilterEnabled(TRUE);
zrenderer->SetAlphaBlendFunc(zRND_ALPHA_FUNC_BLEND);

U mnie działa bez tego, może to kwestia tego, że rysuję je w hooku na funkcję renderująca.


No i mam kolejne pytanie, wie ktoś może jak obliczyć pozycje UV dla np. takiego zestawu punktów? Czy są potrzebne do tego jeszcze jakieś dodatkowe dane?

zVEC2(300, 300);
zVEC2(300, 700);
zVEC2(450, 800);
zVEC2(700, 700);
zVEC2(700, 300);

#Edit
(0.5 + (verts[0] - center.x) / (radius.x * 2)) + " : " + (0.5 + (verts[1] - center.y) / (radius.y * 2)
Ok zdaje mi się, że powinno to mniej więcej tak wyglądać. center.x/center.y = centroida(formuła do ogarnięcia z wiki), radius.x/radius.y = odległość centroida-współrzędna.  :pokerface:

 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry