Pixelfarbe auf eine andere Art holen

MedRamBO

Mitglied
Hi Leute,

ich Programmiere gerade eine Art Logger um die Texturen im Game in einer anderen Farbe darzustellen.
Das wird im Grunde eine Art Mod sein wo das Spiel Left for Dead einfach etwas lustiger wird :)
Naja, ich finde es persönlich zumindest ziemlich dunkel.

Der code soll später wie folgt funktionieren:
Code:
#define Player ( ( ( Numvert == 1545 ) && ( startIndex = 1377 ) && ( primCount == 7568 ) ) ||\
                 ( ( Numvert == 7567 ) && ( startIndex = 4687 ) && ( primCount == 4687 ) ) )

In IDirect3DDevice9::DrawIndexedPrimitive9:

HRESULT WINAPI hkDrawIndexedPrimitive( LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount ) {
	if( Player ) {
		pDevice->SetRenderState( D3DRS_ZENABLE, false );
		pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
		for( int i = 0; i < 6; i++ ) pDevice->SetTexture( i, g_pTexLightPink );
		oDrawIndexedPrimitive( pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount );
		pDevice->SetRenderState( D3DRS_ZENABLE, true );
		pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
		for( int i = 0; i < 6; i++ ) pDevice->SetTexture( i, g_pUltraPink );
	}
}

Dafür brauche ich warscheinlich einen Hook von MSDetours wurde mir in einem anderen Forum gesagt. Egal, zurück zum eigentlichen Problem da dies nur zeigen sollte
worum es geht.

Ich wollte nun eine Art Logger programmieren:
Pseudofunktional funktioniert er wie folgt:
- Du gehst ins Spiel und zielst mit der Mitte des Screens auf die Texture die du painten willst
- Du drückst numpad1 worauf hin ein scan gestartet wird
- Am anfang von DrawIndexedPrimitive holt sich die DLL die Farbe des Pixels in der mitte des Screens ( stellt die Orginalfarbe dar )
- Dann wird die Texture die gerade bemalt wurde mit der Pinken übermalt
- Anschließend am ende von DrawIndexedPrimtive hole ich mir dann nochmal die Farbe vom Pixel in der Mitte
- Wenn die Farben sich unterscheiden, wissen wir das unsere angepeilte Texture gerade durch DrawIndexedPrimitive bemalt wurde,
und wir loggen den Numvert, Primcount und StartIndex in eine datei.

Ich hole mir die Pixelfarbe wie folgt:
Code:
class CColorHelper {
public:
	int r;
	int g;
	int b;
	DWORD rgb;

	void fillStruct( int pixelX, int pixelY ) {
		HDC hdc = GetDC( HWND_DESKTOP );
		rgb = GetPixel( hdc, pixelX, pixelY );
		r = GetRValue( rgb );
		g = GetGValue( rgb );
		b = GetBValue( rgb );
	}

	static bool match( CColorHelper* color1, CColorHelper* color2 ) {
		if( color1->rgb == color2->rgb )
			return true;
		//do range scann
		return false;
	}
};
CColorHelper colorBefore;
CColorHelper colorAfter;
 
//So rufe ich es auf 
 colorBefore.fillStruct( (int)( g_ViewPort.Width / 2.f ), (int)( g_ViewPort.Height / 2.f ) );

Das funktioniert zwar, aber ruft ein sehr großes Lag hervor, da der Screenbuffer ( Frontbuffer oder wie das heißt ), jedesmal neu Gelockt und GeUnlockt wird.
Gerade in DrawIndexedPrimtive, so ziemlicht die meist gecallte Funktion im Spiel, ist das nicht machtbar.

Kennt jemand ne Möglichkeit diese Values anderweitig zu loggen. Vielleicht bin ich ja auch auf dem Holzweg, oder bestenfalls die Farbe direct aus ner
Colormaske vom surface zu bekommen oder so?

Steh noch am Anfang von DirectX und verstehe nicht alles so gut, ich hoffe ihr könnt mir helfen da hier so viel Erfahrung rum klickt :)

Gruß aus Deutschland,
Frank
 
:D "Böse Gedanken" :D Hört sich ein bisschen nach einem Hack an. Ist ja nicht illegal, aber moralisch anrüchig.

Nun, ich bin auch kein DX-Crack, aber diese Variante ist definitiv zu langsam, um spielbar zu sein. Eigentlich gibt es nur eine Variante, sowas richtig zu machen. Die wäre wohl, rausfinden, welche Textur da angesprochen wird und diese mit lediglich einem Hook umfärben. Umgefärbt bleibt sie dann im Speicher und wird so von der Spielengine genutzt.

mfg chmee
 
Ich hoffe nicht das es illegal ist. Soll ja im Rahmen von ner mod passieren alles die ich dann releasen will. Wie würde sowas denn funktionieren, die Texturen umzufärben meine ich?
Vielleicht gibts ja noch weitere Ideen und Anregungen :)

Danke schon mal!
 
Zurück