Po przeniesieniu funkcji z main do plików h oraz cpp tekstury zginęły

0

Cześć

Cały kod miałem w jednym pliku main.cpp (wykorzystuje C++ oraz OpenGL). W związku z tym, że kod zaczął się coraz bardziej rozrastać przeniosłem funkcje dotyczące tekstur z pliku main.cpp do odrębnego pliku h oraz cpp. Wszystko ładnie się kompiluje, ale po uruchomieniu quady, na które były zbindowane tekstury nie mają teraz tekstur tylko są całe czarne. Nie wiem co się mogło stać, w kodzie nie były wprowadzane żadne zmiany.

Pzdr

0

Pokaż kod. W kodzie były wprowadzone zmiany, sam o nich napisałeś.

0

W samej logice kodu nic nie zmieniałem, po prostu przeniosłem kod funkcji z pliku main.cpp do cpp oraz h. W h mam deklaracje zmiennych oraz funkcji, a w cpp mam ciała funkcji. Proszę bardzo oto poniżej kod:

Plik.cpp

#include <windows.h>	
#include <gl\gl.h>		
#include <gl\glu.h>			
#include <math.h>

#include "Textures.h"

void makeCheckImage()
{
	int i, j, c;
	
	for (i = 0; i < CHECK_IMAGE_WIDTH; i++) {
		for (j = 0; j < CHECK_IMAGE_HEIGHT; j++) {
			 c = ((((i&0x8)==0)^((j&0x8))==0))*255;
			checkImage[i][j][0] = (GLubyte) c;
			checkImage[i][j][1] = (GLubyte) c;
			checkImage[i][j][2] = (GLubyte) c;
			checkImage[i][j][3] = (GLubyte) (255 - c);
		}
	}
}

void makeCircleImage()
{
	int i, j;
	float dist;

	for (i = 0; i < CIRCLE_IMAGE_HEIGHT; i++) {
		for (j = 0; j < CIRCLE_IMAGE_WIDTH; j++) {

			dist = sqrt((((float)i - 64) * ((float)i - 64)) + 
				(((float)j - 64) * ((float)j - 64)));

			if (dist < 64)
			{
				circleImage[i][j][0] = (GLubyte) 255;
				circleImage[i][j][1] = (GLubyte) 255;
				circleImage[i][j][2] = (GLubyte) 255;
				circleImage[i][j][3] = (GLubyte) 255;
			} else {
				circleImage[i][j][0] = (GLubyte) 0;
				circleImage[i][j][1] = (GLubyte) 0;
				circleImage[i][j][2] = (GLubyte) 0;
				circleImage[i][j][3] = (GLubyte) 0;
			}
		}
	};
}

void makeNoisePosImage()
{
	int i, j, c;
	
	for (i = 0; i < NOISE_IMAGE_WIDTH; i++) {
		for (j = 0; j < NOISE_IMAGE_HEIGHT; j++) {
			c = rand()%256;
			
			noisePosImage[i][j][0] = (GLubyte) c;
			noisePosImage[i][j][1] = (GLubyte) c;
			noisePosImage[i][j][2] = (GLubyte) c;
			noisePosImage[i][j][3] = (GLubyte) 255;
		}
	}
}

void makeNoiseNegImage()
{
	int i, j, c;
	
	for (i = 0; i < NOISE_IMAGE_WIDTH; i++) {
		for (j = 0; j < NOISE_IMAGE_HEIGHT; j++) {
			c = rand()%256;
				
			noiseNegImage[i][j][0] = 255 - (GLubyte) c;
			noiseNegImage[i][j][1] = 255 - (GLubyte) c;
			noiseNegImage[i][j][2] = 255 - (GLubyte) c;
			noiseNegImage[i][j][3] = (GLubyte) 255;
		}
	}
}

Plik h

#ifndef __TEXTURES_H_
#define __TEXTURES_H_

#define CIRCLE_IMAGE_WIDTH 128
#define CIRCLE_IMAGE_HEIGHT 128

#define CHECK_IMAGE_WIDTH 512
#define CHECK_IMAGE_HEIGHT 512

#define NOISE_IMAGE_WIDTH 128
#define NOISE_IMAGE_HEIGHT 128

static GLubyte circleImage[CIRCLE_IMAGE_WIDTH][CIRCLE_IMAGE_HEIGHT][4];

static GLubyte checkImage[CHECK_IMAGE_WIDTH][CHECK_IMAGE_HEIGHT][4];

static GLubyte noisePosImage[NOISE_IMAGE_WIDTH][NOISE_IMAGE_HEIGHT][4];

static GLubyte noiseNegImage[NOISE_IMAGE_WIDTH][NOISE_IMAGE_HEIGHT][4];

void makeCheckImage();
void makeCircleImage();
void makeNoisePosImage();
void makeNoiseNegImage();

#endif
1
// tablica do tekstury z wypelnionym kolem
static GLubyte circleImage[CIRCLE_IMAGE_WIDTH][CIRCLE_IMAGE_HEIGHT][4];

// tablica do tekstury w szachownice
static GLubyte checkImage[CHECK_IMAGE_WIDTH][CHECK_IMAGE_HEIGHT][4];

// tablica do tekstury z szumem "pozytyw"
static GLubyte noisePosImage[NOISE_IMAGE_WIDTH][NOISE_IMAGE_HEIGHT][4];

// tablica do tekstury z szumem "negatyw"
static GLubyte noiseNegImage[NOISE_IMAGE_WIDTH][NOISE_IMAGE_HEIGHT][4];

Obiekty globalne zadeklarowane jako static są widoczne tylko w swoim TU (± plik .cpp). Efektywnie, masz osobne instancje tych tablic w main.cpp i w Plik.cpp. Wywal static i wstaw extern, lub (lepiej) przenieś je do Plik.cpp, jeśli poza nim z nich nie korzystasz.

0

Usunąłem cpp static , ale niestety pokazują się błędy podczas kompilacji:

Textures.obj : error LNK2005: "unsigned char (* checkImage)[512][4]" (?checkImage@@3PAY1CAA@3EA) already defined in Main.obj
Textures.obj : error LNK2005: "unsigned char (* noisePosImage)[128][4]" (?noisePosImage@@3PAY1IA@3EA) already defined in Main.obj
Textures.obj : error LNK2005: "unsigned char (* noiseNegImage)[128][4]" (?noiseNegImage@@3PAY1IA@3EA) already defined in Main.obj
Textures.obj : error LNK2005: "unsigned char (* circleImage)[128][4]" (?circleImage@@3PAY1IA@3EA) already defined in Main.obj

W main.cpp nie mam zdefiniowanych checkImage, noisePosImage, noiseNegImage, circleImage.

1

Mea culpa. Jeśli ich używasz w main, zadeklaruj je w .h jako extern, a zdefiniuj w jednym z plików (dowolnym na dobrą sprawę, ale sugeruję Plik.cpp)

0

Zadeklarowałem w pliku textures.h

extern GLubyte circleImage;
extern GLubyte checkImage;
extern GLubyte noisePosImage;
extern GLubyte noiseNegImage;

i zdefiniowałm w textures.cpp:

GLubyte circleImage[CIRCLE_IMAGE_WIDTH][CIRCLE_IMAGE_HEIGHT][4];
GLubyte checkImage[CHECK_IMAGE_WIDTH][CHECK_IMAGE_HEIGHT][4];
GLubyte noisePosImage[NOISE_IMAGE_WIDTH][NOISE_IMAGE_HEIGHT][4];
GLubyte noiseNegImage[NOISE_IMAGE_WIDTH][NOISE_IMAGE_HEIGHT][4];

zwraca błąd:

textures.cpp(8): error C2040: 'circleImage' : 'GLubyte [128][128][4]' differs in levels of indirection from 'GLubyte'
textures.cpp(9): error C2040: 'checkImage' : 'GLubyte [512][512][4]' differs in levels of indirection from 'GLubyte'
textures.cpp(10): error C2040: 'noisePosImage' : 'GLubyte [128][128][4]' differs in levels of indirection from 'GLubyte'
extures.cpp(11): error C2040: 'noiseNegImage' : 'GLubyte [128][128][4]' differs in levels of indirection from 'GLubyte'

1

Nie możesz zmieniać typu zmiennej pomiędzy deklaracją i definicją. To nadal mają być tablice:

extern GLubyte circleImage[CIRCLE_IMAGE_WIDTH][CIRCLE_IMAGE_HEIGHT][4];
//...
0

Dziękuję, wszystko działa już poprawnie:) Widzę, że potrzebuje doczytać jeszcze o static i extern.

1 użytkowników online, w tym zalogowanych: 0, gości: 1