У меня есть список целых чисел, полученных с помощью кода C ++ и представляющих различные окружения D3DCOLORVALUE и т. Д. *
Какой правильный метод позволяет получить те же цвета из этих чисел в Delphi??.
Например, используя программу на C ++ (Visual Studio 2012), вызвав библиотечную процедуру на C ++ (отдельный файл dll), я могу получить следующие значения:
-1.44852785e-016 = 2770796799 (represent the color)
1.57844226e+11 = 1376977151 (represent the color)
-1.98938735e+034 = 4168431103 (represent the color)
3.39617733e+038 = 4294967295 (represent the color)
@ Rudy Velthuis, оригинальный код: (некоторые значения, содержащиеся в массиве, являются такими, как показано выше)
int32_t index = ifcObject->indicesForFaces[0];
uint32_t ambient = ((int32_t*) vertices)[index * (vertexElementSize / sizeof(float)) + 6],
diffuse = ((int32_t*) vertices)[index * (vertexElementSize / sizeof(float)) + 7],
emissive = ((int32_t*) vertices)[index * (vertexElementSize / sizeof(float)) + 8],
specular = ((int32_t*) vertices)[index * (vertexElementSize / sizeof(float)) + 9];
Затем в Delphi XE6 с помощью
PInteger (@ColorsArray [index * sizeOfVertices + 6])^
я получаюте же значения, но в Delphi цвета являются черными или нулевыми.Иногда получаются отрицательные числа, подразумевается, что в C ++ можно представить цвет с отрицательным значением, но в delphi не работает.
Как преобразовать значение цвета, полученное в формате D3DCOLORVALUE, к Delphi's TColor?
что значения используются для получения цветов объектов в D3DMATERIAL9, D3DCOLORVALUE Ambient (Ambient color RGB)
FLOAT r;
FLOAT g;
FLOAT b;
FLOAT a;
Эта функция делает цвет:
void SetColor(
D3DCOLORVALUE * iColor,
uint32_t color
)
{
iColor->r = (float) (color & ((unsigned int) 255 * 256 * 256 * 256)) / (256 * 256 * 256);
iColor->r /= 255.f;
iColor->g = (float) (color & (255 * 256 * 256)) / (256 * 256);
iColor->g /= 255.f;
iColor->b = (float) (color & (255 * 256)) / 256;
iColor->b /= 255.f;
iColor->a = (float) (color & (255));
iColor->a /= 255.f;
}
Но в Delphi это не работает, полученный цвет неправильный.
Сравнение цветов с помощью решения @Dsm:
Слева: Цвет получен Справа: Желаемый цвет
Я сделал простой пример, чтобы проиллюстрировать различия:
Первый цвет соответствует основанию столбца, а второй -соответствует столбцу.Рисунок с платформой - это пример со средством просмотра библиотеки с правильными цветами для этой версии, а рисунок справа - это изображение часов в Visual Studio 2012, показывающее, что содержимое массива одинаково, а значениеполученные с использованием приведения также не отличаются, но при преобразовании этих чисел в цвета они не дают одинакового результата.