void DrawUtil::DebugCone( const noVec4 &color, const noVec3 &apex, const noVec3 &dir, float radius1, float radius2, const int lifetime /*= 0 */ ) { int i; noMat3 axis; noVec3 top, p1, p2, lastp1, lastp2, d; axis[2] = dir; axis[2].Normalize(); axis[2].NormalVectors( axis[0], axis[1] ); axis[1] = -axis[1]; top = apex + dir; lastp2 = top + radius2 * axis[1]; if ( radius1 == 0.0f ) { for ( i = 20; i <= 360; i += 20 ) { d = noMath::Sin16( DEG2RAD(i) ) * axis[0] + noMath::Cos16( DEG2RAD(i) ) * axis[1]; p2 = top + d * radius2; DebugLine( color, lastp2, p2, lifetime ); DebugLine( color, p2, apex, lifetime ); lastp2 = p2; } } else { lastp1 = apex + radius1 * axis[1]; for ( i = 20; i <= 360; i += 20 ) { d = noMath::Sin16( DEG2RAD(i) ) * axis[0] + noMath::Cos16( DEG2RAD(i) ) * axis[1]; p1 = apex + d * radius1; p2 = top + d * radius2; DebugLine( color, lastp1, p1, lifetime ); DebugLine( color, lastp2, p2, lifetime ); DebugLine( color, p1, p2, lifetime ); lastp1 = p1; lastp2 = p2; } } }
void DebugRenderer::AddLine(const Vector3& start, const Vector3& end, unsigned color, bool depthTest) { if (lines_.Size() + noDepthLines_.Size() >= MAX_LINES) return; if (depthTest) lines_.Push(DebugLine(start, end, color)); else noDepthLines_.Push(DebugLine(start, end, color)); }
void AbstractBTGenerator::LoadSymbols() { TModulesMap modules = m_process.GetModules(); for (TModulesMap::iterator i = modules.begin(); i != modules.end(); i++) { MODULEINFO modInfo; ZeroMemory(&modInfo, sizeof(modInfo)); QString strModule = i.key(); GetModuleInformation(m_process.GetHandle(), i.value(), &modInfo, sizeof(modInfo)); SymLoadModuleEx( m_process.GetHandle(), NULL, (CHAR*) i.key().toLatin1().constData(), (CHAR*) i.key().toLatin1().constData(), (DWORD64) modInfo.lpBaseOfDll, modInfo.SizeOfImage, NULL, 0); LoadSymbol(strModule, (DWORD64) modInfo.lpBaseOfDll); if (!IsSymbolLoaded(strModule)) { emit MissingSymbol(strModule); } } emit DebugLine(QString()); }
void DrawUtil::DebugArrow( const noVec4 &color, const noVec3 &start, const noVec3 &end, int size, const int lifetime /*= 0 */ ) { noVec3 forward, right, up, v1, v2; float a, s; int i; static float arrowCos[40]; static float arrowSin[40]; static int arrowStep; DebugLine( color, start, end, lifetime ); if ( r_debugArrowStep.GetInteger() <= 10 ) { return; } // calculate sine and cosine when step size changes if ( arrowStep != r_debugArrowStep.GetInteger() ) { arrowStep = r_debugArrowStep.GetInteger(); for (i = 0, a = 0; a < 360.0f; a += arrowStep, i++) { arrowCos[i] = noMath::Cos16( DEG2RAD( a ) ); arrowSin[i] = noMath::Sin16( DEG2RAD( a ) ); } arrowCos[i] = arrowCos[0]; arrowSin[i] = arrowSin[0]; } // draw a nice arrow forward = end - start; forward.Normalize(); forward.NormalVectors( right, up); for (i = 0, a = 0; a < 360.0f; a += arrowStep, i++) { s = 0.5f * size * arrowCos[i]; v1 = end - size * forward; v1 = v1 + s * right; s = 0.5f * size * arrowSin[i]; v1 = v1 + s * up; s = 0.5f * size * arrowCos[i+1]; v2 = end - size * forward; v2 = v2 + s * right; s = 0.5f * size * arrowSin[i+1]; v2 = v2 + s * up; DebugLine( color, v1, end, lifetime ); DebugLine( color, v1, v2, lifetime ); } }
void LoadAssets(game_state *GameState) { // NOTE currently sound is forced at... // Mono, 16 bit, 48000. // anything else won't work. need to implement stereo sound at some point. GameState->TestNote = LoadWave("../assets/testNote.wav"); GameState->TestNoteSampleIndex = 0; GameState->BackgroundImage = GLLoadBMP("../assets/Background.bmp"); GameState->PlayerImage = GLLoadBMP("../assets/Player.bmp"); GameState->GrappleRadiusImage = GLLoadBMP("../assets/LatchRadius.bmp"); GameState->GrappleLineImage = GLLoadBMP("../assets/GrappleLine.bmp"); GameState->GrappleArrowImage = GLLoadBMP("../assets/GrappleArrow.bmp"); GameState->EnemyImage = GLLoadBMP("../assets/Enemy.bmp"); GameState->EnemyHealthBar = GLLoadBMP("../assets/HealthBarBackground.bmp"); // NOTE this line is necessary to initialize the DebugOuput var of GameState. It must be initialized to something. DebugLine("Loaded", GameState); }
internal void DebugTriangle(v2i *p0, v2i *p1, v2i *p2, u32 color) { DebugLine(p0->x, p0->y, p1->x, p1->y, color); DebugLine(p0->x, p0->y, p2->x, p2->y, color); DebugLine(p1->x, p1->y, p2->x, p2->y, color); }
void AbstractBTGenerator::Run(HANDLE hThread, bool bFaultingThread) { assert(m_process.IsValid()); assert(hThread); if (!Init()) { assert(false); return; } if (bFaultingThread) { const QString threadInfo = QString("Faulting thread (%1)").arg( reinterpret_cast<quintptr>(hThread) ); emit DebugLine(threadInfo); } else { const QString threadInfo = QString("Thread %1").arg( reinterpret_cast<quintptr>(hThread) ); emit DebugLine(threadInfo); } //HANDLE hFile = CreateFile(L"C:\\test\\test.dmp", FILE_ALL_ACCESS, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL); //if (!MiniDumpWriteDump(m_process.GetHandle(), m_process.GetId(), hFile, // MiniDumpNormal, NULL, NULL, NULL)) //{ // HRESULT hres = (HRESULT) GetLastError(); // printf("%08X\n\n", hres); //} //SafeCloseHandle(hFile); DWORD dw = SuspendThread(hThread); assert(dw != DWORD(-1)); if (dw == DWORD(-1)) { qCritical() << "SuspendThread() failed: " << GetLastError(); return; } CONTEXT context; ZeroMemory(&context, sizeof(context)); if (!bFaultingThread) { // if it's not the faulting thread, get its context context.ContextFlags = CONTEXT_FULL; if (!GetThreadContext(hThread, &context)) { ResumeThread(hThread); assert(false); qCritical() << "GetThreadContext() failed: " << GetLastError(); return; } } else { // if it is, get it from KCrash HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, sharedMemoryName); if (hMapFile == NULL) { qCritical() << "OpenFileMapping() failed: " << GetLastError(); return; } CONTEXT *othercontext = (CONTEXT*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(CONTEXT)); if (othercontext == NULL) { qCritical() << "MapViewOfFile() failed: " << GetLastError(); SafeCloseHandle(hMapFile); return; } CopyMemory(&context, othercontext, sizeof(CONTEXT)); UnmapViewOfFile(othercontext); // continue even if it fails SafeCloseHandle(hMapFile); } // some of this stuff is taken from StackWalker ZeroMemory(&m_currentFrame, sizeof(m_currentFrame)); DWORD machineType = IMAGE_FILE_MACHINE_UNKNOWN; #if defined(_M_IX86) machineType = IMAGE_FILE_MACHINE_I386; m_currentFrame.AddrPC.Offset = context.Eip; m_currentFrame.AddrFrame.Offset = context.Ebp; m_currentFrame.AddrStack.Offset = context.Esp; #elif defined(_M_X64) machineType = IMAGE_FILE_MACHINE_AMD64; m_currentFrame.AddrPC.Offset = context.Rip; m_currentFrame.AddrFrame.Offset = context.Rbp; m_currentFrame.AddrStack.Offset = context.Rsp; #else # error This architecture is not supported. #endif m_currentFrame.AddrPC.Mode = AddrModeFlat; m_currentFrame.AddrFrame.Mode = AddrModeFlat; m_currentFrame.AddrStack.Mode = AddrModeFlat; SymSetOptions(SymGetOptions() | SYMOPT_UNDNAME | SYMOPT_LOAD_LINES); SymInitialize(m_process.GetHandle(), NULL, FALSE); LoadSymbols(); for (int i = 0; /*nothing*/; i++) { SetLastError(0); if (!StackWalk64( machineType, m_process.GetHandle(), hThread, &m_currentFrame, &context, &Callbacks::ReadProcessMemory, &Callbacks::SymFunctionTableAccess64, &Callbacks::SymGetModuleBase64, NULL)) { emit Finished(); qDebug() << "Stackwalk finished; GetLastError=" << GetLastError(); break; } FrameChanged(); QString modulename = GetModuleName(); QString functionname = GetFunctionName(); QString file = GetFile(); int line = GetLine(); QString address = QString::number(m_currentFrame.AddrPC.Offset, 16); QString debugLine = QString::fromLatin1(BACKTRACE_FORMAT). arg(modulename).arg(functionname).arg(file).arg(line).arg(address); emit DebugLine(debugLine); } // Resume the target thread now, or else the crashing process will not // be terminated ResumeThread(hThread); SymCleanup(m_process.GetHandle()); emit DebugLine(QString()); }