Cześć,
mam dwie takie same biblioteki jedna w c++, druga w c#. Mam napisaną funkcje w c++ i próbuję stworzyć taką samą w c#, ale nie wiem jak ugryźć memcpy i jak dokładnie ta funkcja działa.
void loadHeightmapFromImage(TerrainInfo& info, const Image& image)
{
uint bpp = 0;
bool flip = false;
switch (image.getFormat())
{
case PF_BYTE_A: case PF_BYTE_L:
bpp = 1; break;
case PF_BYTE_LA: case PF_L16:
bpp = 2; break;
case PF_BYTE_RGB:
bpp = 3; break;
case PF_BYTE_BGR:
bpp = 3; flip = true; break;
case PF_BYTE_RGBA:
bpp = 4; break;
case PF_BYTE_BGRA:
bpp = 4; flip = true; break;
default:
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Can't use the given image's format.", "loadHeightmapFromImage");
}
size_t size = image.getWidth() * image.getHeight();
unsigned int maxVal = (1 << (bpp*8)) - 1;
std::vector<float> data (size);
const uchar* imageData = image.getData(); // definicja - const uchar * getData() const;
for (size_t i = 0; i < size; ++i)
{
uchar read[4] = {0, 0, 0, 0}; // nie rozumiem tego? po co taka tablica?
// TODO: Make this big endian aware/compatible
memcpy(read, imageData, bpp); // czytamy dane
imageData += bpp; // po co tutaj dodawana jest ta wartość do danych?
if (flip) // zamieniamy w zależności od formatu pliku
swap(read[0], read[2]);
unsigned int val = * ((unsigned int*)read); // tablica do int? co to ma na celu?
data[i] = float(val) / maxVal;
}
info.setHeightmap(image.getWidth(), image.getHeight(), data);
}
Moja funkcja w c#
unsafe static public void loadHeightmapFromImage(TerrainInfo info, Image image)
{
int bpp = 0;
bool flip = false;
switch (image.Format)
{
case PixelFormat.PF_BYTE_A: case PixelFormat.PF_BYTE_L:
bpp = 1;
break;
case PixelFormat.PF_BYTE_LA: case PixelFormat.PF_L16:
bpp = 2;
break;
case PixelFormat.PF_BYTE_RGB:
bpp = 3;
break;
case PixelFormat.PF_BYTE_BGR:
bpp = 3; flip = true;
break;
case PixelFormat.PF_BYTE_RGBA:
bpp = 4;
break;
case PixelFormat.PF_BYTE_BGRA:
bpp = 4; flip = true;
break;
default:
LogManager.Singleton.LogMessage(OgreException.LastException.FullDescription);
break;
}
int size = Convert.ToInt32(image.Width * image.Height);
int maxVal = (1 << (bpp*8)) - 1;
float[] data = new float[size];
// tutaj nie mam pomysły jak to zrobić
// w c# mamy image.Data, a typ to byte*
info.setHeightmap(Convert.ToInt32(image.Width), Convert.ToInt32(image.Height), data);
}