|
Новичок
Регистрация: 16.01.2022
Сообщений: 28
С нами:
2276608
Репутация:
8
|
|
Сообщение от daun.daunovich.01
Да я уже давно справился с этой задачей. Но всё равно спасибо.
Всем привет. Вопрос следующего характера. Не могу понять, почему при Render`е обычного 3D текста через графическую библиотеку ImGui при ALT + ENTER (смене разрешения) всё нормально, но, стоит мне сделать ALT + ENTER, то ники мои вообще не вижу (собсна, которые рендерю через ImGui)
А если я сделаю ALT + ENTER в момент когда рендерится ник над головой, то игра вообще не развернётся и всё.
В чём трабл?
Единственное что удивляет, с HP/Armour барами такого нету.
Может дело в шрифте?
cpp:
Код:
void
__fastcall
CPlayerTags_DrawHealthBar_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
float
fHealth
,
float
fArmour
,
float
fDistanceToCamera
)
{
if
(
!
deviceReset
)
return
cPlayerTags_DrawHealthBar
(
thisptr
,
position
,
fHealth
,
fArmour
,
fDistanceToCamera
)
;
Main
::
RenderBars
(
position
,
fDistanceToCamera
,
fHealth
,
fArmour
)
;
}
void
__fastcall
CPlayerTags_DrawLabel_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
const
char
*
szText
,
unsigned
long
color
,
float
fDistanceCamera
,
bool
bDrawStatus
,
int
nStatus
)
{
/*if (true) {
return;
}*/
if
(
!
deviceReset
)
return
cPlayerTags_DrawLabel
(
thisptr
,
position
,
szText
,
color
,
fDistanceCamera
,
bDrawStatus
,
nStatus
)
;
Main
::
RenderText
(
szText
,
position
,
color
,
fDistanceCamera
)
;
}
Инициализация ImGui
.
Events
::
initGameEvent
+=
[
]
(
)
{
CHooks
::
InitMinHook
(
)
;
ImGui
::
CreateContext
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
(
void
)
io
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NoMouseCursorChange
;
myFont
=
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
if
(
myFont
==
nullptr
)
{
printf
(
"font not found\n"
)
;
myFont
=
io
.
Fonts
->
AddFontDefault
(
)
;
}
ImGui
::
StyleColorsDark
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
CHooks
::
GameLoop_HookInstall
(
)
;
CHooks
::
CLabel__DrawHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawLabelHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawHealthBarHookInstall
(
)
;
return
true
;
}
;
Events
::
d3dResetEvent
+=
[
]
(
)
{
deviceReset
=
true
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
ImGui_ImplDX9_CreateDeviceObjects
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
io
.
Fonts
->
Build
(
)
;
return
true
;
}
;
Events
::
d3dLostEvent
+=
[
]
(
)
{
if
(
!
deviceReset
)
return
true
;
deviceReset
=
false
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
Fonts
->
Clear
(
)
;
// Очистить текущие шрифты
return
true
;
}
;
extern
"C"
__declspec
(
dllexport
)
void
Ext_RenderText
(
const
char
*
szText
,
CVectorSamp
*
position
,
unsigned
long
color
,
float
fDistanceToCamera
,
bool
isBot
=
false
)
{
if
(
!
deviceReset
)
return
;
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
position
->
z
=
fDistanceToCamera
*
0.047499999
+
position
->
z
+
0.2
;
RwV3d pos
{
position
->
x
,
position
->
y
,
position
->
z
}
;
RwV3d out
;
float
width
,
height
;
uint8_t
r
,
g
,
b
,
a
;
CUtils
::
explode_argb
(
(
uint32_t
)
color
,
a
,
r
,
g
,
b
)
;
CVector cameraPos
=
TheCamera
.
GetPosition
(
)
;
CEntity
*
entity
=
FindPlayerPed
(
)
;
CColPoint colPoint
;
bool
isLineOfSight
=
!
CWorld
::
ProcessLineOfSight
(
cameraPos
,
pos
,
colPoint
,
entity
,
true
,
false
,
false
,
true
,
false
,
true
,
false
,
false
)
;
if
(
!
isLineOfSight
)
return
;
if
(
CSprite
::
CalcScreenCoors
(
pos
,
&
out
,
&
width
,
&
height
,
true
,
true
)
)
{
ImVec2
screenPos
(
out
.
x
,
out
.
y
+
4.0f
)
;
ImDrawList
*
drawList
=
ImGui
::
GetForegroundDrawList
(
)
;
std
::
string utf8Text
=
CUtils
::
ConvertAnsiToUtf8
(
szText
)
;
auto
RemoveColorCodes
=
[
]
(
const
std
::
string
&
text
)
->
std
::
string
{
std
::
string result
=
text
;
size_t pos
=
0
;
while
(
(
pos
=
result
.
find
(
'{'
,
pos
)
)
!=
std
::
string
::
npos
)
{
size_t endPos
=
result
.
find
(
'}'
,
pos
)
;
if
(
endPos
!=
std
::
string
::
npos
)
{
result
.
erase
(
pos
,
endPos
-
pos
+
1
)
;
}
else
{
break
;
}
}
return
result
;
}
;
std
::
string nickname
;
int
playerID
=
-
1
;
size_t openBracket
=
utf8Text
.
find
(
'('
)
;
if
(
openBracket
!=
std
::
string
::
npos
)
{
size_t closeBracket
=
utf8Text
.
find
(
')'
,
openBracket
)
;
if
(
closeBracket
!=
std
::
string
::
npos
)
{
nickname
=
utf8Text
.
substr
(
0
,
openBracket
)
;
std
::
string idString
=
utf8Text
.
substr
(
openBracket
+
1
,
closeBracket
-
openBracket
-
1
)
;
try
{
playerID
=
std
::
stoi
(
idString
)
;
}
catch
(
const
std
::
exception
&
)
{
playerID
=
-
1
;
}
if
(
!
nickname
.
empty
(
)
&&
nickname
.
back
(
)
==
' '
)
{
nickname
.
pop_back
(
)
;
}
}
}
else
{
nickname
=
utf8Text
;
playerID
=
-
1
;
}
UINT32 characterId
=
0
;
if
(
CHooks
::
playersCharacterId
.
contains
(
playerID
)
)
{
characterId
=
CHooks
::
playersCharacterId
[
playerID
]
;
}
if
(
!
characterId
&&
!
isBot
)
return
;
if
(
isBot
)
characterId
=
playerID
;
nickname
=
RemoveColorCodes
(
nickname
)
;
std
::
string characterIdPart
=
" #"
+
std
::
to_string
(
characterId
)
;
ImVec2 nicknameSize
=
ImGui
::
CalcTextSize
(
nickname
.
c_str
(
)
)
;
ImVec2 characterIdSize
=
ImGui
::
CalcTextSize
(
characterIdPart
.
c_str
(
)
)
;
ImVec2 totalSize
=
ImVec2
(
nicknameSize
.
x
+
characterIdSize
.
x
,
std
::
max
(
nicknameSize
.
y
,
characterIdSize
.
y
)
)
;
ImVec2 centeredPos
=
screenPos
;
centeredPos
.
x
-=
totalSize
.
x
/
2.0f
;
centeredPos
.
y
-=
totalSize
.
y
/
2.0f
;
auto
DrawTextOutline
=
[
&
]
(
const
ImVec2
&
pos
,
const
std
::
string
&
text
,
ImU32 textColor
,
ImU32 outlineColor
=
IM_COL32
(
0
,
0
,
0
,
255
)
)
{
float
outlineThickness
=
1.0f
;
ImVec2 offsets
[
]
=
{
ImVec2
(
-
outlineThickness
,
-
outlineThickness
)
,
// лево-верх
ImVec2
(
0
,
-
outlineThickness
)
,
// верх
ImVec2
(
outlineThickness
,
-
outlineThickness
)
,
// право-верх
ImVec2
(
-
outlineThickness
,
0
)
,
// лево
ImVec2
(
outlineThickness
,
0
)
,
// право
ImVec2
(
-
outlineThickness
,
outlineThickness
)
,
// лево-низ
ImVec2
(
0
,
outlineThickness
)
,
// низ
ImVec2
(
outlineThickness
,
outlineThickness
)
// право-низ
}
;
for
(
int
layer
=
0
;
layer
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
outlinePos
,
outlineColor
,
text
.
c_str
(
)
)
;
}
}
drawList
->
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
pos
,
textColor
,
text
.
c_str
(
)
)
;
}
;
if
(
!
nickname
.
empty
(
)
)
{
ImU32 nicknameColor
=
IM_COL32
(
r
,
g
,
b
,
255
)
;
DrawTextOutline
(
centeredPos
,
nickname
,
nicknameColor
)
;
}
ImVec2 characterIdPos
=
ImVec2
(
centeredPos
.
x
+
nicknameSize
.
x
,
centeredPos
.
y
)
;
ImU32 whiteColor
=
IM_COL32
(
255
,
255
,
255
,
255
)
;
DrawTextOutline
(
characterIdPos
,
characterIdPart
,
whiteColor
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
}
У меня подобное было при рендере текста через DirectX, попробуй восстанавливать состояние, я обошёл это обычным перезапуском рендера
|