Как сделать Gradient box?

Участник
Статус
Оффлайн
Регистрация
3 Июн 2017
Сообщения
351
Реакции[?]
291
Поинты[?]
0
Собственно вопрос, как сделать такие элементы (за именем)?

Если можно ЛС или под хайд от новорегов)

AddRectFilledMultiColor - не катит
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
думаю не составит труда допилить до нужного эффекта....


первым делом описываем прототип для функции:
Что нам будет нужно? Нам необходимо указывать положение в пространстве:
Код:
int x, int y,
нужна возможность указывать свои размеры(высота\ширина):
Код:
int w, int h,
необходимо выбирать цвета начального и конечного цветов:
Код:
D3DCOLOR Col_start, D3DCOLOR Col_end,
в задумке нужна возможность выбора ориентации заливки цветом, поэтому указываем "ссылку" на структуру, которую заведем немного позже:
Код:
 Gradient_orientation orientation_Box ,
ну и конечно же указатель на наше устройство:
Код:
IDirect3DDevice9* pDevice
С аргументами для функции мы закончали))

перейдем непосредственно к самому описанию тела:


первым делом заводим структуру для буффера вершин:
Код:
static struct D3DVERTEX
   {
   int x,
     y,
   z;
   D3DCOLOR color;
   }
теперь описыываем сам буффер:
Код:
Buff_Vertex[4] = {
   {0,0,0,1.0f,0},
   {0,0,0,1.0f,0},
   {0,0,0,1.0f,0},
   {0,0,0,1.0f,0}};

заполняем буффер согласно нашей структуре:
Код:
Buff_Vertex[0].x = x;
   Buff_Vertex[0].y = y;
   Buff_Vertex[0].color = Col_start;

   Buff_Vertex[1].x = x+w;
   Buff_Vertex[1].y = y;
   Buff_Vertex[1].color = orientation_Box == horizontal ? Col_end : Col_start;

   Buff_Vertex[2].x = x;
   Buff_Vertex[2].y = y+h;
   Buff_Vertex[2].color = orientation_Box == horizontal ? Col_start : Col_end;

   Buff_Vertex[3].x = x+w;
   Buff_Vertex[3].y = y+h;
   Buff_Vertex[3].color = Col_end;
немного поясню этот код, думаю многим из вас эта структура не известна:
Код:
orientation_Box == horizontal ? Col_end : Col_start;
эта запись равносильна этой:
Код:
if(a==b)
{
выполняем если условия соблюдены
}
else
{
выполняем если условия НЕ соблюдены
}

Теперь нарисуем созданный нами буффер вершин:
Код:
pDevice->SetTexture(0, NULL);
   pDevice->SetPixelShader( 0 );
   pDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE);
   pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
   pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
   pDevice->SetRenderState(D3DRS_ZENABLE , FALSE);
   pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
   pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,Buff_Vertex,sizeof(D3DVERTEX));

С самой функцией все)

теперь опишем структуру для направления заливки:
Код:
enum Gradient_orientation
   {
   horizontal,
   vertical
  };
использовать ее так:
Для горизонтальной заливки
Код:
Gradient_Box(.....,horizontal ,..... );
Для вертикальной заливки
Код:
Gradient_Box(.....,vertical ,..... );

Получается примерно следующее:



ЗЫ: Писал этот пост для другого сайта и с другой целью, но думаю будет в тему)
 
Продавец
Статус
Оффлайн
Регистрация
15 Сен 2017
Сообщения
275
Реакции[?]
130
Поинты[?]
10K
А вот плох с XONE пастить)
Если по поводу реализации, то очень легко.
 
Участник
Статус
Оффлайн
Регистрация
3 Июн 2017
Сообщения
351
Реакции[?]
291
Поинты[?]
0
Сверху Снизу