HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 02.01.2019, 20:26
f0Re3t
Постоянный
Регистрация: 16.04.2017
Сообщений: 883
С нами: 4777096

Репутация: 163


По умолчанию

Функция разбивает расстояние между 2 векторами на кучу векторов с некоторым шагом.

Использование: split(float x0, float y0, float z0, float x1, float y1, float z1, float step)

x0, y0, z0 - начальные координаты (первый вектор)

x1, y1, z1 - конечные координаты (второй вектор)

step - шаг, с которым будет поделено расстояние между векторами.

Возвращает вектор с разбитым расстоянием.

C++:





[CODE]
std
::
vector

split
(
float
x0
,
float
y0
,
float
z0
,
float
x1
,
float
y1
,
float
z1
,
float
step
)
{
CVector direction
=
{
x1
-
x0
,
y1
-
y0
,
z1
-
z0
}
;
float
distance
=
direction
.
Normalize
(
)
;
std
::
vector

path
;
CVector begin
=
{
x0
,
y0
,
z0
}
;
CVector cursor
=
{
x0
,
y0
,
z0
}
;
path
.
push_back
(
cursor
)
;
while
(
(
cursor
-
begin
)
.
Length
(
)

 
Ответить с цитированием

  #22  
Старый 06.02.2019, 00:32
ЯedЯuM
Участник форума
Регистрация: 13.03.2016
Сообщений: 242
С нами: 5351007

Репутация: 0
По умолчанию

Цитата:
Сообщение от Stiopko  

Работа с регистром (Подсмотрел с коллизи Фипа)

C++:





Код:
#pragma once
#include 
#pragma comment(lib, "advapi32.lib")
namespace
Register
{
namespace
Write
{
bool
Bool
(
HKEY
&
key
,
const
char
*
name
,
const
bool
&
value
)
{
static
DWORD val
;
val
=
value
;
return
RegSetValueExA
(
key
,
name
,
0
,
REG_DWORD
,
(
BYTE
*
)
&
val
,
1
)
==
ERROR_SUCCESS
;
}
bool
Int
(
HKEY
&
key
,
const
char
*
name
,
const
int
&
value
)
{
static
DWORD val
;
val
=
value
;
return
RegSetValueExA
(
key
,
name
,
0
,
REG_DWORD
,
(
BYTE
*
)
&
val
,
4
)
==
ERROR_SUCCESS
;
}
bool
String
(
HKEY
&
key
,
const
char
*
name
,
const
char
*
value
,
int
dwBufLen
)
{
return
RegSetValueExA
(
key
,
name
,
0
,
REG_SZ
,
(
BYTE
*
)
value
,
dwBufLen
)
==
ERROR_SUCCESS
;
}
}
namespace
Read
{
bool
Bool
(
HKEY
&
key
,
const
char
*
name
,
bool
&
value
)
{
static
DWORD val
=
0
,
type
=
REG_DWORD
,
size
=
4
;
bool
result
=
RegQueryValueExA
(
key
,
name
,
NULL
,
&
type
,
(
BYTE
*
)
&
val
,
&
size
)
==
ERROR_SUCCESS
;
value
=
val
!=
0
;
return
result
;
}
bool
Int
(
HKEY
&
key
,
const
char
*
name
,
int
&
value
)
{
static
DWORD val
=
0
,
type
=
REG_DWORD
,
size
=
4
;
bool
result
=
RegQueryValueExA
(
key
,
name
,
NULL
,
&
type
,
(
BYTE
*
)
&
val
,
&
size
)
==
ERROR_SUCCESS
;
value
=
val
;
return
result
;
}
bool
String
(
HKEY
&
key
,
char
*
name
,
char
*
to
,
DWORD dwBufLen
)
{
static
DWORD dwType
=
REG_SZ
;
return
RegQueryValueExA
(
key
,
name
,
NULL
,
&
dwType
,
(
BYTE
*
)
to
,
&
dwBufLen
)
==
ERROR_SUCCESS
;
}
}
}

Намного удобнее и больше функционала https://blast.hk/threads/13855/
 
Ответить с цитированием

  #23  
Старый 28.03.2019, 20:13
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Полезные функции для работы с памятью:

C++:





Код:
void
WriteMemory
(
void
*
address
,
void
*
bytes
,
int
byteSize
)
{
DWORD NewProtection
;
VirtualProtect
(
address
,
byteSize
,
PAGE_EXECUTE_READWRITE
,
&
NewProtection
)
;
memcpy
(
address
,
bytes
,
byteSize
)
;
VirtualProtect
(
address
,
byteSize
,
NewProtection
,
&
NewProtection
)
;
}


C++:





Код:
void
nop_
(
PVOID address
,
int
bytes
)
{
DWORD NewProtection
;
VirtualProtect
(
address
,
bytes
,
PAGE_EXECUTE_READWRITE
,
&
NewProtection
)
;
memset
(
address
,
0x90
,
bytes
)
;
VirtualProtect
(
address
,
bytes
,
NewProtection
,
&
NewProtection
)
;
}


пример:

C++:





Код:
WriteMemory
(
(
void
*
)
0x004BA3B9
,
(
uint8_t
*
)
"\xE9\xA7\x03\x00\x00"
,
5
)
;
// адрес в котором будем изменять память, какие байты пойдут туда, размер(количество байт)
nop_
(
(
void
*
)
(
0x004BA3B9
)
,
1
)
;
адрес
,
количество нопов
 
Ответить с цитированием

  #24  
Старый 16.04.2019, 23:21
iAmerican
Постоянный
Регистрация: 17.02.2014
Сообщений: 611
С нами: 6438231

Репутация: 133


По умолчанию

C++:





Код:
std
::
string
formatString
(
const
char
*
fmt
,
.
.
.
)
{
va_list args
;
va_start
(
args
,
fmt
)
;
std
::
vector

v
(
1024
)
;
while
(
true
)
{
va_list args2
;
va_copy
(
args2
,
args
)
;
int
res
=
vsnprintf
(
v
.
data
(
)
,
v
.
size
(
)
,
fmt
,
args2
)
;
if
(
(
res
>=
0
)
&&
(
res

(
v
.
size
(
)
)
)
)
{
va_end
(
args
)
;
va_end
(
args2
)
;
return
std
::
string
(
v
.
data
(
)
)
;
}
size_t size
;
if
(
res

(
res
)
+
1
;
v
.
clear
(
)
;
v
.
resize
(
size
)
;
va_end
(
args2
)
;
}
}


Не совсем для SF , но может кому и пригодиться.

Для тех кому не нравится форматировать строки через массив чар.

Автор вроде как : 5nw .

Пример :

C++:





Код:
int
iA
=
1
;
float
fA
=
2.0
;
std
::
string sA
=
"privet"
;
std
::
string myVar
=
formatString
(
"int : %i , float : %f , string : %s"
,
iA
,
fA
,
sA
)
;
 
Ответить с цитированием

  #25  
Старый 25.04.2019, 10:30
Неадекватная сова
Постоянный
Регистрация: 02.06.2018
Сообщений: 342
С нами: 4183567

Репутация: 133
По умолчанию

Включение/выключение рендера чата и клавиш "T", "F6":

C++:





Код:
static
bool
state
=
true
;
static
bool
vp
=
false
;
void
sampChatVisible
(
)
{
state
^=
true
;
DWORD sampBase
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
;
DWORD temp
;
DWORD chatKeyT
=
sampBase
+
0x5DAF4
+
0x11
;
DWORD chatKeyF6
=
sampBase
+
0x5D891
;
DWORD chatRender
=
sampBase
+
0x63D70
;
if
(
!
vp
)
{
VirtualProtect
(
(
void
*
)
chatKeyT
,
0x1
,
PAGE_EXECUTE_READWRITE
,
&
temp
)
;
VirtualProtect
(
(
void
*
)
chatKeyF6
,
0x1
,
PAGE_EXECUTE_READWRITE
,
&
temp
)
;
VirtualProtect
(
(
void
*
)
chatRender
,
0x1
,
PAGE_EXECUTE_READWRITE
,
&
temp
)
;
vp
=
true
;
}
*
(
byte
*
)
chatKeyT
=
state
?
0x75
:
0xEB
;
*
(
byte
*
)
chatKeyF6
=
state
?
0x8B
:
0xC3
;
*
(
byte
*
)
chatRender
=
state
?
0x55
:
0xC3
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
m_nPrevScrollBarPosition
=
1
;
}


Поддержка русских букв ImGui для VS2013 и прочих, где нету литералов по типу u8:

C++:





Код:
#pragma execution_character_set("utf-8")
 
Ответить с цитированием

  #26  
Старый 15.05.2019, 21:22
Cake_
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами: 4793630

Репутация: 133
По умолчанию

Преобразование RGBA в ImVec4

C++:





Код:
const
ImVec4
&
RGBAToImVec4
(
const
uint8
&
r
,
const
uint8
&
g
,
const
uint8
&
b
,
const
uint8
&
a
)
{
static
float
it
=
1.
/
255
;
return
ImVec4
(
r
*
it
,
g
*
it
,
b
*
it
,
a
*
it
)
;
}




Преобразование RGBA в float

C++:





Код:
#define RGBA_TO_FLOAT(r,g,b,a) (float)r/255.0f, (float)g/255.0f, (float)b/255.0f, (float)a/255.0f


 
Ответить с цитированием

  #27  
Старый 18.05.2019, 12:54
Cake_
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами: 4793630

Репутация: 133
По умолчанию

Длина вектор

C++:





Код:
float
VectorLength
(
const
Vector4D
&
v
)
{
return
sqrt
(
v
.
x
*
v
.
x
+
v
.
y
*
v
.
y
+
v
.
z
*
v
.
z
+
v
.
w
*
v
.
w
)
;
}


 
Ответить с цитированием

  #28  
Старый 22.05.2019, 02:13
_=Gigant=_
Участник форума
Регистрация: 19.01.2017
Сообщений: 130
С нами: 4901705

Репутация: 98
По умолчанию

C++:





Код:
uint8_t
getPlayerWeaponModelID
(
int
iPlayerID
)
{
if
(
g_Players
==
NULL
||
iPlayerID

SAMP_MAX_PLAYERS
)
return
NULL
;
if
(
iPlayerID
==
g_Players
->
sLocalPlayerID
)
{
if
(
g_Players
->
pLocalPlayer
->
pSAMP_Actor
==
NULL
)
return
NULL
;
return
g_Players
->
pLocalPlayer
->
onFootData
.
byteCurrentWeapon
;
}
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
==
NULL
)
return
NULL
;
return
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
onFootData
.
byteCurrentWeapon
;
}
const
char
*
getPlayerWeapon
(
int
iPlayerID
)
{
if
(
g_Players
==
NULL
||
iPlayerID

SAMP_MAX_PLAYERS
)
return
NULL
;
if
(
iPlayerID
==
g_Players
->
sLocalPlayerID
)
{
for
(
int
wep
=
0
;
weapon_list
[
wep
]
.
name
!=
nullptr
;
wep
++
)
{
const
struct
weapon_entry
*
weapon
=
&
weapon_list
[
wep
]
;
if
(
weapon
->
id
==
getPlayerWeaponModelID
(
iPlayerID
)
)
return
weapon
->
name
;
}
}
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
==
NULL
)
return
NULL
;
for
(
int
wep
=
0
;
weapon_list
[
wep
]
.
name
!=
nullptr
;
wep
++
)
{
const
struct
weapon_entry
*
weapon
=
&
weapon_list
[
wep
]
;
if
(
weapon
->
id
==
getPlayerWeaponModelID
(
iPlayerID
)
)
return
weapon
->
name
;
}
return
NULL
;
}


here if someone need to get current player weapon name

usage: ("%s", getPlayerWeapon(playerid));

Target Selector with multiple options for samp

Цитата:
Сообщение от Спойлер  


C++:





Код:
void
renderTargetSelector
(
int
PlayerID
,
byte BONE_ID_BOX
,
byte BONE_ID_TARGET
,
byte BONE_ID_MY
,
byte HP_BAR_BONE
,
float
box_width
,
float
box_add_x_pos
,
float
box_height
,
float
box_add_y_pos
,
bool
DrawLine
,
bool
DrawBox
,
bool
bShowTargetPos
,
int
pos_text_add_x
,
int
pos_text_add_y
,
bool
AddHealthBar
,
bool
bShowHPValue
,
float
hp_bar_width
,
float
hp_bar_height
,
bool
bCopyTargetRotation
,
bool
bFollowTarget
,
D3DCOLOR COLOR_HP_BAR
,
D3DCOLOR COLOR_POS_TEXT
,
D3DCOLOR COLOR_SAME
,
D3DCOLOR COLOR_BOX
,
D3DCOLOR COLOR_LINE
,
bool
bUseSameColors
,
bool
bUseTargetColor
,
bool
bUseCustomColors
)
{
traceLastFunc
(
"renderTargetSelector()"
)
;
if
(
cheat_state
->
_generic
.
cheat_panic_enabled
)
return
;
if
(
!
pGameInterface
)
return
;
if
(
!
g_dwSAMP_Addr
||
!
g_SAMP
||
!
g_Players
)
return
;
if
(
gta_menu_active
(
)
)
return
;
actor_info
*
me
=
actor_info_get
(
ACTOR_SELF
,
NULL
)
;
actor_info
*
target
=
getGTAPedFromSAMPPlayerID
(
PlayerID
)
;
if
(
!
me
)
return
;
if
(
!
target
)
return
;
CPed
*
pPedTarget
=
pGameInterface
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
target
)
;
CPed
*
pPedSelf
=
pGameInterface
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
me
)
;
D3DXVECTOR3 box_get_vec
,
target_vec_box_set
,
target_pos_get
,
render_pos
,
hp_bar_check
,
hp_bar_render
;
CVector target_bone_for_box_vec
=
GetBonePosition
(
PlayerID
,
BONE_ID_BOX
)
;
CVector target_mainbone_vec
=
GetBonePosition
(
PlayerID
,
BONE_ID_TARGET
)
;
CVector target_hpbar_bone_vec
=
GetBonePosition
(
PlayerID
,
HP_BAR_BONE
)
;
// hp bar set
CVector my_bone_vec
=
GetBonePosition
(
ACTOR_SELF
,
BONE_ID_MY
)
;
float
*
f_pos
=
&
target
->
base
.
matrix
[
4
*
3
]
;
box_get_vec
.
x
=
CVecToD3DXVEC
(
target_bone_for_box_vec
)
.
x
;
box_get_vec
.
y
=
CVecToD3DXVEC
(
target_bone_for_box_vec
)
.
y
;
box_get_vec
.
z
=
CVecToD3DXVEC
(
target_bone_for_box_vec
)
.
z
;
CalcScreenCoors
(
&
box_get_vec
,
&
target_vec_box_set
)
;
D3DCOLOR color_target
=
samp_color_get
(
PlayerID
)
;
if
(
render
)
{
if
(
bShowTargetPos
)
{
char
print_pos
[
128
]
;
target_pos_get
.
x
=
f_pos
[
0
]
;
target_pos_get
.
y
=
f_pos
[
1
]
;
target_pos_get
.
z
=
f_pos
[
2
]
;
CalcScreenCoors
(
&
target_pos_get
,
&
render_pos
)
;
if
(
render_pos
.
z

PrintShadow
(
render_pos
.
x
+
pos_text_add_x
,
render_pos
.
y
+
pos_text_add_y
,
COLOR_SAME
,
print_pos
)
;
}
else
if
(
bUseTargetColor
)
{
pD3DFont_3DInformer
->
PrintShadow
(
render_pos
.
x
+
pos_text_add_x
,
render_pos
.
y
+
pos_text_add_y
,
color_target
,
print_pos
)
;
}
else
if
(
bUseCustomColors
)
{
pD3DFont_3DInformer
->
PrintShadow
(
render_pos
.
x
+
pos_text_add_x
,
render_pos
.
y
+
pos_text_add_y
,
COLOR_POS_TEXT
,
print_pos
)
;
}
}
}
if
(
bUseSameColors
)
{
if
(
DrawBox
)
render
->
D3DBox
(
target_vec_box_set
.
x
+
box_add_x_pos
,
target_vec_box_set
.
y
+
box_add_y_pos
,
box_width
,
box_height
,
COLOR_SAME
)
;
if
(
DrawLine
)
render
->
DrawLine
(
CVecToD3DXVEC
(
target_mainbone_vec
)
,
CVecToD3DXVEC
(
my_bone_vec
)
,
COLOR_SAME
)
;
}
else
if
(
bUseTargetColor
)
{
if
(
DrawBox
)
render
->
D3DBox
(
target_vec_box_set
.
x
+
box_add_x_pos
,
target_vec_box_set
.
y
+
box_add_y_pos
,
box_width
,
box_height
,
color_target
)
;
if
(
DrawLine
)
render
->
DrawLine
(
CVecToD3DXVEC
(
target_mainbone_vec
)
,
CVecToD3DXVEC
(
my_bone_vec
)
,
color_target
)
;
}
else
if
(
bUseCustomColors
)
{
if
(
DrawBox
)
render
->
D3DBox
(
target_vec_box_set
.
x
+
box_add_x_pos
,
target_vec_box_set
.
y
+
box_add_y_pos
,
box_width
,
box_height
,
COLOR_BOX
)
;
if
(
DrawLine
)
render
->
DrawLine
(
CVecToD3DXVEC
(
target_mainbone_vec
)
,
CVecToD3DXVEC
(
my_bone_vec
)
,
COLOR_LINE
)
;
}
if
(
AddHealthBar
)
{
hp_bar_check
.
x
=
CVecToD3DXVEC
(
target_hpbar_bone_vec
)
.
x
;
hp_bar_check
.
y
=
CVecToD3DXVEC
(
target_hpbar_bone_vec
)
.
y
;
hp_bar_check
.
z
=
CVecToD3DXVEC
(
target_hpbar_bone_vec
)
.
z
;
CalcScreenCoors
(
&
hp_bar_check
,
&
hp_bar_render
)
;
char
hp_bar
[
128
]
;
float
hp_bar_lenght
=
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
fActorHealth
+
hp_bar_width
;
if
(
bShowHPValue
)
_snprintf_s
(
hp_bar
,
sizeof
(
hp_bar
)
-
1
,
"%u"
,
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
onFootData
.
byteHealth
)
;
if
(
bUseCustomColors
)
{
render
->
D3DBox
(
hp_bar_render
.
x
,
hp_bar_render
.
y
,
hp_bar_lenght
,
hp_bar_height
,
COLOR_HP_BAR
)
;
if
(
bShowHPValue
)
pD3DFont_Nametags
->
PrintShadow
(
hp_bar_render
.
x
+
hp_bar_lenght
,
hp_bar_render
.
y
,
COLOR_HP_BAR
,
hp_bar
)
;
}
else
if
(
bUseTargetColor
)
{
render
->
D3DBox
(
hp_bar_render
.
x
,
hp_bar_render
.
y
,
hp_bar_lenght
,
hp_bar_height
,
color_target
)
;
if
(
bShowHPValue
)
pD3DFont_Nametags
->
PrintShadow
(
hp_bar_render
.
x
+
hp_bar_lenght
,
hp_bar_render
.
y
,
color_target
,
hp_bar
)
;
}
else
if
(
bUseSameColors
)
{
render
->
D3DBox
(
hp_bar_render
.
x
,
hp_bar_render
.
y
,
hp_bar_lenght
,
hp_bar_height
,
COLOR_SAME
)
;
if
(
bShowHPValue
)
pD3DFont_Nametags
->
PrintShadow
(
hp_bar_render
.
x
+
hp_bar_lenght
,
hp_bar_render
.
y
,
COLOR_SAME
,
hp_bar
)
;
}
}
}
if
(
bCopyTargetRotation
)
{
vect3_copy
(
&
target
->
fCurrentRotation
,
&
me
->
fCurrentRotation
)
;
}
if
(
bFollowTarget
)
{
float
follow_pos_copy
[
3
]
;
vect3_copy
(
&
target
->
base
.
matrix
[
4
*
3
]
,
follow_pos_copy
)
;
follow_pos_copy
[
2
]
-=
1.0f
;
cheat_actor_teleport
(
me
,
follow_pos_copy
,
gta_interior_id_get
(
)
)
;
}
}


 
Ответить с цитированием

  #29  
Старый 03.06.2019, 22:11
ALF
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами: 4472205

Репутация: 163
По умолчанию

удобная функция для установки таймеров

Цитата:
Сообщение от Спойлер  


C++:





Код:
#include 
// если не хотите тащить chrono, можно использовать GetTickCount() или другую аналогичную функцию
template

void
addTimer
(
T Func
,
int64_t
Wait
)
{
using
std
::
chrono
::
duration_cast
;
using
std
::
chrono
::
milliseconds
;
using
std
::
chrono
::
steady_clock
;
static
int64_t
iTime
=
0
;
if
(
duration_cast

(
steady_clock
::
now
(
)
.
time_since_epoch
(
)
)
.
count
(
)
-
iTime
>
Wait
)
{
Func
(
)
;
iTime
=
duration_cast

(
steady_clock
::
now
(
)
.
time_since_epoch
(
)
)
.
count
(
)
;
}
}


Цитата:
Сообщение от Спойлер  


C++:





[CODE]
void
Foo
(
)
{
std
::
cout



чуть-чуть информации которая может пригодиться при использовании лямбда-выражений

Цитата:
Сообщение от Спойлер  


Код:





Код:
[] - без захвата переменных
[=] - все переменные захватываются по значению
[&] - все переменные захватываются по ссылке


 
Ответить с цитированием

  #30  
Старый 07.06.2019, 12:12
Cake_
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами: 4793630

Репутация: 133
По умолчанию

Круглый слайдер для "ImGui"

Цитата:
Сообщение от Спойлер  


C++:





Код:
static
bool
MyKnob
(
const
char
*
label
,
float
*
p_value
,
float
v_min
,
float
v_max
)
{
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
ImGuiStyle
&
style
=
ImGui
::
GetStyle
(
)
;
float
radius_outer
=
20.0f
;
ImVec2 pos
=
ImGui
::
GetCursorScreenPos
(
)
;
ImVec2 center
=
ImVec2
(
pos
.
x
+
radius_outer
,
pos
.
y
+
radius_outer
)
;
float
line_height
=
ImGui
::
GetTextLineHeight
(
)
;
ImDrawList
*
draw_list
=
ImGui
::
GetWindowDrawList
(
)
;
float
ANGLE_MIN
=
3.141592f
*
0.75f
;
float
ANGLE_MAX
=
3.141592f
*
2.25f
;
ImGui
::
InvisibleButton
(
label
,
ImVec2
(
radius_outer
*
2
,
radius_outer
*
2
+
line_height
+
style
.
ItemInnerSpacing
.
y
)
)
;
bool
value_changed
=
false
;
bool
is_active
=
ImGui
::
IsItemActive
(
)
;
bool
is_hovered
=
ImGui
::
IsItemActive
(
)
;
if
(
is_active
&&
io
.
MouseDelta
.
x
!=
0.0f
)
{
float
step
=
(
v_max
-
v_min
)
/
200.0f
;
*
p_value
+=
io
.
MouseDelta
.
x
*
step
;
if
(
*
p_value

v_max
)
*
p_value
=
v_max
;
value_changed
=
true
;
}
float
t
=
(
*
p_value
-
v_min
)
/
(
v_max
-
v_min
)
;
float
angle
=
ANGLE_MIN
+
(
ANGLE_MAX
-
ANGLE_MIN
)
*
t
;
float
angle_cos
=
cosf
(
angle
)
,
angle_sin
=
sinf
(
angle
)
;
float
radius_inner
=
radius_outer
*
0.40f
;
draw_list
->
AddCircleFilled
(
center
,
radius_outer
,
ImGui
::
GetColorU32
(
ImGuiCol_FrameBg
)
,
16
)
;
draw_list
->
AddLine
(
ImVec2
(
center
.
x
+
angle_cos
*
radius_inner
,
center
.
y
+
angle_sin
*
radius_inner
)
,
ImVec2
(
center
.
x
+
angle_cos
*
(
radius_outer
-
2
)
,
center
.
y
+
angle_sin
*
(
radius_outer
-
2
)
)
,
ImGui
::
GetColorU32
(
ImGuiCol_SliderGrabActive
)
,
2.0f
)
;
draw_list
->
AddCircleFilled
(
center
,
radius_inner
,
ImGui
::
GetColorU32
(
is_active
?
ImGuiCol_FrameBgActive
:
is_hovered
?
ImGuiCol_FrameBgHovered
:
ImGuiCol_FrameBg
)
,
16
)
;
draw_list
->
AddText
(
ImVec2
(
pos
.
x
,
pos
.
y
+
radius_outer
*
2
+
style
.
ItemInnerSpacing
.
y
)
,
ImGui
::
GetColorU32
(
ImGuiCol_Text
)
,
label
)
;
if
(
is_active
||
is_hovered
)
{
ImGui
::
SetNextWindowPos
(
ImVec2
(
pos
.
x
-
style
.
WindowPadding
.
x
,
pos
.
y
-
line_height
-
style
.
ItemInnerSpacing
.
y
-
style
.
WindowPadding
.
y
)
)
;
ImGui
::
BeginTooltip
(
)
;
ImGui
::
Text
(
"%.3f"
,
*
p_value
)
;
ImGui
::
EndTooltip
(
)
;
}
return
value_changed
;
}


https://imgur.com/a/c0B3A9s
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.