int main(int argc, char* argv[]) { int sz = sizeof(b3Generic6DofConstraint); int sz2 = sizeof(b3Point2PointConstraint); int sz3 = sizeof(b3TypedConstraint); int sz4 = sizeof(b3TranslationalLimitMotor); int sz5 = sizeof(b3RotationalLimitMotor); int sz6 = sizeof(b3Transform); //b3OpenCLUtils::setCachePath("/Users/erwincoumans/develop/mycache"); b3SetCustomEnterProfileZoneFunc(b3ProfileManager::Start_Profile); b3SetCustomLeaveProfileZoneFunc(b3ProfileManager::Stop_Profile); b3SetCustomPrintfFunc(myprintf); b3Vector3 test=b3MakeVector3(1,2,3); test.x = 1; test.y = 4; printf("main start"); b3CommandLineArgs args(argc,argv); ParticleDemo::ConstructionInfo ci; if (args.CheckCmdLineFlag("help")) { Usage(); return 0; } selectedDemo = loadCurrentDemoEntry(sStartFileName); args.GetCmdLineArgument("selected_demo",selectedDemo); if (args.CheckCmdLineFlag("new_batching")) { useNewBatchingKernel = true; } bool benchmark=args.CheckCmdLineFlag("benchmark"); args.GetCmdLineArgument("max_framecount",maxFrameCount); args.GetCmdLineArgument("shadowmap_size",shadowMapWorldSize); args.GetCmdLineArgument("shadowmap_resolution",shadowMapWidth); shadowMapHeight=shadowMapWidth; if (args.CheckCmdLineFlag("disable_shadowmap")) { useShadowMap = false; } args.GetCmdLineArgument("pair_benchmark_file",gPairBenchFileName); gDebugLauncherCL = args.CheckCmdLineFlag("debug_kernel_launch"); dump_timings=args.CheckCmdLineFlag("dump_timings"); ci.useOpenCL = !args.CheckCmdLineFlag("disable_opencl"); ci.m_useConcaveMesh = true;//args.CheckCmdLineFlag("use_concave_mesh"); if (ci.m_useConcaveMesh) { enableExperimentalCpuConcaveCollision = true; } ci.m_useInstancedCollisionShapes = !args.CheckCmdLineFlag("no_instanced_collision_shapes"); args.GetCmdLineArgument("cl_device", ci.preferredOpenCLDeviceIndex); args.GetCmdLineArgument("cl_platform", ci.preferredOpenCLPlatformIndex); gAllowCpuOpenCL = args.CheckCmdLineFlag("allow_opencl_cpu"); gUseLargeBatches = args.CheckCmdLineFlag("use_large_batches"); gUseJacobi = args.CheckCmdLineFlag("use_jacobi"); gUseDbvt = args.CheckCmdLineFlag("use_dbvt"); gDumpContactStats = args.CheckCmdLineFlag("dump_contact_stats"); gCalcWorldSpaceAabbOnCpu = args.CheckCmdLineFlag("calc_aabb_cpu"); gUseCalculateOverlappingPairsHost = args.CheckCmdLineFlag("calc_pairs_cpu"); gIntegrateOnCpu = args.CheckCmdLineFlag("integrate_cpu"); gConvertConstraintOnCpu = args.CheckCmdLineFlag("convert_constraints_cpu"); useUniformGrid = args.CheckCmdLineFlag("use_uniform_grid"); args.GetCmdLineArgument("x_dim", ci.arraySizeX); args.GetCmdLineArgument("y_dim", ci.arraySizeY); args.GetCmdLineArgument("z_dim", ci.arraySizeZ); args.GetCmdLineArgument("x_gap", ci.gapX); args.GetCmdLineArgument("y_gap", ci.gapY); args.GetCmdLineArgument("z_gap", ci.gapZ); gPause = args.CheckCmdLineFlag("paused"); gDebugForceLoadingFromSource = args.CheckCmdLineFlag("load_cl_kernels_from_disk"); gDebugSkipLoadingBinary = args.CheckCmdLineFlag("disable_cached_cl_kernels"); #ifndef B3_NO_PROFILE b3ProfileManager::Reset(); #endif //B3_NO_PROFILE window = new b3gDefaultOpenGLWindow(); b3gWindowConstructionInfo wci(g_OpenGLWidth,g_OpenGLHeight); window->createWindow(wci); window->setResizeCallback(MyResizeCallback); window->setMouseMoveCallback(MyMouseMoveCallback); window->setMouseButtonCallback(MyMouseButtonCallback); window->setKeyboardCallback(MyKeyboardCallback); window->setWindowTitle("Bullet 3.x GPU Rigid Body http://bulletphysics.org"); printf("-----------------------------------------------------\n"); #ifndef __APPLE__ glewInit(); #endif gui = new GwenUserInterface(); printf("started GwenUserInterface"); GLPrimitiveRenderer prim(g_OpenGLWidth,g_OpenGLHeight); stash = initFont(&prim); if (gui) { gui->init(g_OpenGLWidth,g_OpenGLHeight,stash,window->getRetinaScale()); printf("init fonts"); gui->setToggleButtonCallback(MyButtonCallback); gui->registerToggleButton(MYPAUSE,"Pause"); gui->registerToggleButton(MYPROFILE,"Profile"); gui->registerToggleButton(MYRESET,"Reset"); int numItems = sizeof(allDemos)/sizeof(ParticleDemo::CreateFunc*); demoNames.clear(); for (int i=0;i<numItems;i++) { GpuDemo* demo = allDemos[i](); demoNames.push_back(demo->getName()); delete demo; } gui->registerComboBox(MYCOMBOBOX1,numItems,&demoNames[0],selectedDemo); gui->setComboBoxCallback(MyComboBoxCallback); } do { bool syncOnly = false; gReset = false; { GLint err; glEnable(GL_BLEND); err = glGetError(); b3Assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_DEPTH_TEST); err = glGetError(); b3Assert(err==GL_NO_ERROR); window->startRendering(); glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);//|GL_STENCIL_BUFFER_BIT); glEnable(GL_DEPTH_TEST); sth_begin_draw(stash); //sth_draw_text(stash, droidRegular,12.f, dx, dy-50, "How does this OpenGL True Type font look? ", &dx,width,height); int spacing = 0;//g_OpenGLHeight; float sx,sy,dx,dy,lh; sx = 0; sy = g_OpenGLHeight; dx = sx; dy = sy; //if (1) const char* msg[] = {"Please wait, initializing the OpenCL demo", "Please make sure to run the demo on a high-end discrete GPU with OpenCL support", "The first time it can take a bit longer to compile the OpenCL kernels.", "Check the console if it takes longer than 1 minute or if a demos has issues.", "Please share the full commandline output when reporting issues:", "App_Bullet3_OpenCL_Demos_* >> error.log", "", "", #ifdef _DEBUG "Some of the demos load a large .obj file,", "please use an optimized build of this app for faster parsing", "", "", #endif "You can press F1 to create a single screenshot,", "or press F2 toggle screenshot (useful to create movies)", "", "", "There are various command-line options such as --benchmark", "See http://github.com/erwincoumans/bullet3 for more information" }; int fontSize = 68; int nummsg = sizeof(msg)/sizeof(const char*); for (int i=0;i<nummsg;i++) { char txt[512]; sprintf(txt,"%s",msg[i]); //sth_draw_text(stash, droidRegular,i, 10, dy-spacing, txt, &dx,g_OpenGLWidth,g_OpenGLHeight); sth_draw_text(stash, droidRegular,fontSize, 10, spacing, txt, &dx,g_OpenGLWidth,g_OpenGLHeight); spacing+=fontSize; fontSize = 32; } sth_end_draw(stash); sth_flush_draw(stash); window->endRendering(); } static bool once=true; //glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); window->setWheelCallback(b3DefaultWheelCallback); { GpuDemo* demo = allDemos[selectedDemo](); sDemo = demo; // demo->myinit(); bool useGpu = false; //int maxObjectCapacity=128*1024; int maxObjectCapacity=1024*1024; maxObjectCapacity = b3Max(maxObjectCapacity,ci.arraySizeX*ci.arraySizeX*ci.arraySizeX+10); { ci.m_instancingRenderer = new GLInstancingRenderer(maxObjectCapacity);//render.getInstancingRenderer(); ci.m_window = window; ci.m_gui = gui; ci.m_instancingRenderer->init(); ci.m_instancingRenderer->resize(g_OpenGLWidth,g_OpenGLHeight); ci.m_instancingRenderer->InitShaders(); ci.m_primRenderer = &prim; // render.init(); } { demo->initPhysics(ci); } printf("-----------------------------------------------------\n"); FILE* csvFile = 0; FILE* detailsFile = 0; if (benchmark) { char prefixFileName[1024]; char csvFileName[1024]; char detailsFileName[1024]; b3OpenCLDeviceInfo info; b3OpenCLUtils::getDeviceInfo(demo->getInternalData()->m_clDevice,&info); //todo: move this time stuff into the Platform/Window class #ifdef _WIN32 SYSTEMTIME time; GetLocalTime(&time); char buf[1024]; DWORD dwCompNameLen = 1024; if (0 != GetComputerName(buf, &dwCompNameLen)) { printf("%s", buf); } else { printf("unknown", buf); } sprintf(prefixFileName,"%s_%s_%s_%d_%d_%d_date_%d-%d-%d_time_%d-%d-%d",info.m_deviceName,buf,demoNames[selectedDemo],ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ,time.wDay,time.wMonth,time.wYear,time.wHour,time.wMinute,time.wSecond); #else timeval now; gettimeofday(&now,0); struct tm* ptm; ptm = localtime (&now.tv_sec); char buf[1024]; #ifdef __APPLE__ sprintf(buf,"MacOSX"); #else sprintf(buf,"Unix"); #endif sprintf(prefixFileName,"%s_%s_%s_%d_%d_%d_date_%d-%d-%d_time_%d-%d-%d",info.m_deviceName,buf,demoNames[selectedDemo],ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ, ptm->tm_mday, ptm->tm_mon+1, ptm->tm_year+1900, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); #endif sprintf(csvFileName,"%s.csv",prefixFileName); sprintf(detailsFileName,"%s.txt",prefixFileName); printf("Open csv file %s and details file %s\n", csvFileName,detailsFileName); //GetSystemTime(&time2); csvFile=fopen(csvFileName,"w"); detailsFile = fopen(detailsFileName,"w"); if (detailsFile) defaultOutput = detailsFile; //if (f) // fprintf(f,"%s (%dx%dx%d=%d),\n", g_deviceName,ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ,ci.arraySizeX*ci.arraySizeY*ci.arraySizeZ); } fprintf(defaultOutput,"Demo settings:\n"); fprintf(defaultOutput," SelectedDemo=%d, demoname = %s\n", selectedDemo, demo->getName()); fprintf(defaultOutput," x_dim=%d, y_dim=%d, z_dim=%d\n",ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ); fprintf(defaultOutput," x_gap=%f, y_gap=%f, z_gap=%f\n",ci.gapX,ci.gapY,ci.gapZ); fprintf(defaultOutput,"\nOpenCL settings:\n"); fprintf(defaultOutput," Preferred cl_device index %d\n", ci.preferredOpenCLDeviceIndex); fprintf(defaultOutput," Preferred cl_platform index%d\n", ci.preferredOpenCLPlatformIndex); fprintf(defaultOutput,"\n"); if (demo->getInternalData()->m_platformId) { b3OpenCLUtils::printPlatformInfo( demo->getInternalData()->m_platformId); fprintf(defaultOutput,"\n"); b3OpenCLUtils::printDeviceInfo( demo->getInternalData()->m_clDevice); fprintf(defaultOutput,"\n"); } do { GLint err = glGetError(); assert(err==GL_NO_ERROR); if (exportFrame || exportMovie) { if (!renderTexture) { renderTexture = new GLRenderToTexture(); GLuint renderTextureId; glGenTextures(1, &renderTextureId); // "Bind" the newly created texture : all future texture functions will modify this texture glBindTexture(GL_TEXTURE_2D, renderTextureId); // Give an empty image to OpenGL ( the last "0" ) //glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, g_OpenGLWidth,g_OpenGLHeight, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0); //glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA32F, g_OpenGLWidth,g_OpenGLHeight, 0,GL_RGBA, GL_FLOAT, 0); glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA32F, g_OpenGLWidth,g_OpenGLHeight, 0,GL_RGBA, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); renderTexture->init(g_OpenGLWidth,g_OpenGLHeight,renderTextureId, RENDERTEXTURE_COLOR); } bool result = renderTexture->enable(); } err = glGetError(); assert(err==GL_NO_ERROR); b3ProfileManager::Reset(); b3ProfileManager::Increment_Frame_Counter(); // render.reshape(g_OpenGLWidth,g_OpenGLHeight); ci.m_instancingRenderer->resize(g_OpenGLWidth,g_OpenGLHeight); prim.setScreenSize(g_OpenGLWidth,g_OpenGLHeight); err = glGetError(); assert(err==GL_NO_ERROR); window->startRendering(); err = glGetError(); assert(err==GL_NO_ERROR); glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);//|GL_STENCIL_BUFFER_BIT); glEnable(GL_DEPTH_TEST); err = glGetError(); assert(err==GL_NO_ERROR); if (!gPause) { B3_PROFILE("clientMoveAndDisplay"); demo->clientMoveAndDisplay(); } else { } { B3_PROFILE("renderScene"); demo->renderScene(); } err = glGetError(); assert(err==GL_NO_ERROR); /*if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getNumCollisionObjects()) { B3_PROFILE("renderPhysicsWorld"); b3AlignedObjectArray<b3CollisionObject*> arr = demo->getDynamicsWorld()->getCollisionObjectArray(); b3CollisionObject** colObjArray = &arr[0]; render.renderPhysicsWorld(demo->getDynamicsWorld()->getNumCollisionObjects(),colObjArray, syncOnly); syncOnly = true; } */ if (exportFrame || exportMovie) { char fileName[1024]; sprintf(fileName,"screenShot%d.png",frameIndex++); writeTextureToPng(g_OpenGLWidth,g_OpenGLHeight,fileName); exportFrame = false; renderTexture->disable(); } { B3_PROFILE("gui->draw"); if (gui && gDrawGui) gui->draw(g_OpenGLWidth,g_OpenGLHeight); } err = glGetError(); assert(err==GL_NO_ERROR); { B3_PROFILE("window->endRendering"); window->endRendering(); } err = glGetError(); assert(err==GL_NO_ERROR); { B3_PROFILE("glFinish"); } if (dump_timings) { b3ProfileManager::dumpAll(stdout); } if (csvFile) { static int frameCount=0; if (frameCount>0) { DumpSimulationTime(csvFile); if (detailsFile) { fprintf(detailsFile,"\n==================================\nFrame %d:\n", frameCount); b3ProfileManager::dumpAll(detailsFile); } } if (frameCount>=maxFrameCount) window->setRequestExit(); frameCount++; } if (gStep) gPause=true; } while (!window->requestedExit() && !gReset); demo->exitPhysics(); b3ProfileManager::CleanupMemory(); delete ci.m_instancingRenderer; delete demo; sDemo = 0; if (detailsFile) { fclose(detailsFile); detailsFile=0; } if (csvFile) { fclose(csvFile); csvFile=0; } } } while (gReset); if (gui) gui->setComboBoxCallback(0); { delete gui; gui=0; exitFont(); window->closeWindow(); delete window; window = 0; } return 0; }
void SimpleOpenGL3App::drawText( const char* txt, int posX, int posY) { // //printf("str = %s\n",unicodeText); float dx=0; int measureOnly=0; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (1)//m_useTrueTypeFont) { bool measureOnly = false; float fontSize= 64;//512;//128; sth_draw_text(m_data->m_fontStash, m_data->m_droidRegular,fontSize,posX,posY, txt,&dx, this->m_instancingRenderer->getScreenWidth(),this->m_instancingRenderer->getScreenHeight(),measureOnly,m_window->getRetinaScale()); sth_end_draw(m_data->m_fontStash); sth_flush_draw(m_data->m_fontStash); } else { //float width = 0.f; int pos=0; float color[]={0.2f,0.2,0.2f,1.f}; glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,m_data->m_fontTextureId); //float width = r.x; float extraSpacing = 0.; int startX = posX; int startY = posY; while (txt[pos]) { int c = txt[pos]; //r.h = g_DefaultNormalFont->m_CharHeight; //r.w = g_DefaultNormalFont->m_CharWidth[c]+extraSpacing; int endX = startX+g_DefaultNormalFont->m_CharWidth[c]; int endY = startY+g_DefaultNormalFont->m_CharHeight; //Gwen::Rect rect = r; //Translate( rect ); float currentColor[]={0.2f,0.2,0.2f,1.f}; m_primRenderer->drawTexturedRect(startX, startY, endX, endY, currentColor,g_DefaultNormalFont->m_CharU0[c],g_DefaultNormalFont->m_CharV0[c],g_DefaultNormalFont->m_CharU1[c],g_DefaultNormalFont->m_CharV1[c]); //DrawTexturedRect(0,r,g_DefaultNormalFont->m_CharU0[c],g_DefaultNormalFont->m_CharV0[c],g_DefaultNormalFont->m_CharU1[c],g_DefaultNormalFont->m_CharV1[c]); // DrawFilledRect(r); startX = endX; //startY = endY; pos++; } glBindTexture(GL_TEXTURE_2D,0); } glDisable(GL_BLEND); }
int main(int argc, char* argv[]) { CommandLineArgs args(argc,argv); if (args.CheckCmdLineFlag("help")) { Usage(); return 0; } args.GetCmdLineArgument("enable_interop", useInterop); printf("useInterop=%d\n",useInterop); args.GetCmdLineArgument("pause_simulation", pauseSimulation); printf("pause_simulation=%d\n",pauseSimulation); args.GetCmdLineArgument("x_dim", NUM_OBJECTS_X); args.GetCmdLineArgument("y_dim", NUM_OBJECTS_Y); args.GetCmdLineArgument("z_dim", NUM_OBJECTS_Z); args.GetCmdLineArgument("x_gap", X_GAP); args.GetCmdLineArgument("y_gap", Y_GAP); args.GetCmdLineArgument("z_gap", Z_GAP); printf("x_dim=%d, y_dim=%d, z_dim=%d\n",NUM_OBJECTS_X,NUM_OBJECTS_Y,NUM_OBJECTS_Z); printf("x_gap=%f, y_gap=%f, z_gap=%f\n",X_GAP,Y_GAP,Z_GAP); args.GetCmdLineArgument("enable_static", keepStaticObjects); printf("enable_static=%d\n",keepStaticObjects); char* tmpfile = 0; args.GetCmdLineArgument("load_bulletfile", tmpfile ); if (tmpfile) fileName = tmpfile; printf("load_bulletfile=%s\n",fileName); printf("\n"); #ifdef __APPLE__ MacOpenGLWindow* window = new MacOpenGLWindow(); window->init(g_OpenGLWidth,g_OpenGLHeight); #else Win32OpenGLWindow* window = new Win32OpenGLWindow(); btgWindowConstructionInfo wci; wci.m_width = g_OpenGLWidth; wci.m_height = g_OpenGLHeight; window->createWindow(wci); window->setWindowTitle("render test"); #endif float retinaScale = 1; #ifndef __APPLE__ GLenum err = glewInit(); #else retinaScale = window->getRetinaScale(); #endif window->runMainLoop(); window->startRendering(); window->endRendering(); int maxObjectCapacity=128*1024; GLInstancingRenderer render(maxObjectCapacity); sth_stash* stash = initFont(); render.InitShaders(); createSceneProgrammatically(render); render.writeTransforms(); window->runMainLoop(); window->setMouseButtonCallback(MyMouseButtonCallback); window->setMouseMoveCallback(MyMouseMoveCallback); window->setResizeCallback(MyResizeCallback); window->setKeyboardCallback(btDefaultKeyboardCallback); window->setWheelCallback(btDefaultWheelCallback); GLPrimitiveRenderer* pprender = new GLPrimitiveRenderer(g_OpenGLWidth,g_OpenGLHeight); glUseProgram(0); //////////////////////////////// setupGUI(g_OpenGLWidth,g_OpenGLHeight,stash,retinaScale); ///////////////////////////////////// if (pCanvas) { pCanvas->SetSize(g_OpenGLWidth,g_OpenGLHeight); } class CProfileIterator* m_profileIterator; m_profileIterator = CProfileManager::Get_Iterator(); glClearColor(1,1,1,1); while (!window->requestedExit()) { CProfileManager::Reset(); { BT_PROFILE("loop"); if (shootObject) { shootObject = false; btVector3 linVel;// = (m_cameraPosition-m_cameraTargetPosition).normalize()*-100; int x,y; window->getMouseCoordinates(x,y); render.getMouseDirection(&linVel[0],x,y); linVel.normalize(); linVel*=100; // btVector3 startPos; float orn[4] = {0,0,0,1}; float pos[4]; render.getCameraPosition(pos); // demo.setObjectTransform(pos,orn,0); //render.writeSingleInstanceTransformToGPU(pos,orn,0); // createScene(render, demo); // printf("numPhysicsInstances= %d\n", demo.m_numPhysicsInstances); // printf("numDynamicPhysicsInstances= %d\n", demo.m_numDynamicPhysicsInstances); // render.writeTransforms(); } { BT_PROFILE("startRendering"); window->startRendering(); } render.RenderScene(); glFinish(); float col[4]={0,1,0,1}; // pprender->drawRect(10,50,120,60,col); // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //glEnable(GL_TEXTURE_2D); float x = 10; float y=220; float dx=0; if (0) { BT_PROFILE("font sth_draw_text"); sth_begin_draw(stash); sth_flush_draw(stash); sth_draw_text(stash, droidRegular,20.f, x, y, "Non-retina font rendering !@#$", &dx,g_OpenGLWidth,g_OpenGLHeight,0,1);//retinaScale); if (retinaScale!=1.f) sth_draw_text(stash, droidRegular,20.f*retinaScale, x, y+20, "Retina font rendering!@#$", &dx,g_OpenGLWidth,g_OpenGLHeight,0,retinaScale); sth_flush_draw(stash); sth_end_draw(stash); } if (1) { BT_PROFILE("gwen RenderCanvas"); if (pCanvas) { glEnable(GL_BLEND); GLint err = glGetError(); assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); err = glGetError(); assert(err==GL_NO_ERROR); err = glGetError(); assert(err==GL_NO_ERROR); glDisable(GL_DEPTH_TEST); err = glGetError(); assert(err==GL_NO_ERROR); //glColor4ub(255,0,0,255); err = glGetError(); assert(err==GL_NO_ERROR); err = glGetError(); assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); // saveOpenGLState(width,height);//m_glutScreenWidth,m_glutScreenHeight); err = glGetError(); assert(err==GL_NO_ERROR); err = glGetError(); assert(err==GL_NO_ERROR); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); err = glGetError(); assert(err==GL_NO_ERROR); err = glGetError(); assert(err==GL_NO_ERROR); glEnable(GL_BLEND); err = glGetError(); assert(err==GL_NO_ERROR); pCanvas->RenderCanvas(); //restoreOpenGLState(); } } window->endRendering(); } CProfileManager::Increment_Frame_Counter(); static bool printStats = true; if (printStats && !pauseSimulation) { static int count = 0; count--; if (count<0) { count = 100; { //BT_PROFILE("processProfileData"); processProfileData(m_profileIterator,false); } //CProfileManager::dumpAll(); //printStats = false; } else { // printf("."); } } } delete pprender; // render.CleanupShaders(); #ifdef _WIN32 window->closeWindow(); #else window->exit(); #endif delete window; return 0; }
int main(int argc, char* argv[]) { GLint err; b3CommandLineArgs args(argc,argv); if (args.CheckCmdLineFlag("help")) { Usage(); return 0; } args.GetCmdLineArgument("enable_interop", useInterop); printf("useInterop=%d\n",useInterop); args.GetCmdLineArgument("pause_simulation", pauseSimulation); printf("pause_simulation=%d\n",pauseSimulation); char* tmpfile = 0; args.GetCmdLineArgument("load_bulletfile", tmpfile ); if (tmpfile) fileName = tmpfile; printf("load_bulletfile=%s\n",fileName); int width = 700; int height= 512; printf("\n"); b3gDefaultOpenGLWindow* window = new b3gDefaultOpenGLWindow(); window->createWindow(b3gWindowConstructionInfo(width,height)); window->setWindowTitle("font test"); #ifndef __APPLE__ err = glewInit(); #endif window->runMainLoop(); loadShader(); loadBufferData(); initTestTexture(); window->startRendering(); window->endRendering(); err = glGetError(); b3Assert(err==GL_NO_ERROR); // render.InitShaders(); // render.writeTransforms(); window->runMainLoop(); // window->setMouseCallback(b3DefaultMouseCallback); // window->setKeyboardCallback(b3DefaultKeyboardCallback); // window->setWheelCallback(b3DefaultWheelCallback); err = glGetError(); b3Assert(err==GL_NO_ERROR); int done; struct sth_stash* stash = 0; FILE* fp = 0; int datasize; float sx,sy,dx,dy,lh; int droidRegular;//, droidItalic, droidBold, droidJapanese, dejavu; GLuint texture; int fontTextureWidth = 512; int fontTextureHeight = 512; SimpleOpenGL2RenderCallbacks* renderCallbacks = new SimpleOpenGL2RenderCallbacks(&sData); stash = sth_create(fontTextureWidth,fontTextureHeight,renderCallbacks); err = glGetError(); b3Assert(err==GL_NO_ERROR); if (!stash) { fprintf(stderr, "Could not create stash.\n"); return -1; } // Load the first truetype font from memory (just because we can). #ifdef _WIN32 const char* fontPath = "../../bin/"; #else const char* fontPath = "./"; #endif char fullFontFileName[1024]; sprintf(fullFontFileName,"%s%s",fontPath,"DroidSerif-Regular.ttf");//cour.ttf");//times.ttf");//DroidSerif-Regular.ttf"); //sprintf(fullFontFileName,"%s%s",fontPath,"arial.ttf");//cour.ttf");//times.ttf");//DroidSerif-Regular.ttf"); fp = fopen(fullFontFileName, "rb"); #ifdef LOAD_FONT_FROM_FILE unsigned char* data; err = glGetError(); b3Assert(err==GL_NO_ERROR); b3Assert(fp); if (fp) { fseek(fp, 0, SEEK_END); datasize = (int)ftell(fp); fseek(fp, 0, SEEK_SET); data = (unsigned char*)malloc(datasize); if (data == NULL) { b3Assert(0); return -1; } else fread(data, 1, datasize, fp); fclose(fp); fp = 0; } if (!(droidRegular = sth_add_font_from_memory(stash, data))) { b3Assert(0); return -1; } err = glGetError(); b3Assert(err==GL_NO_ERROR); // Load the remaining truetype fonts directly. sprintf(fullFontFileName,"%s%s",fontPath,"DroidSerif-Italic.ttf"); if (!(droidItalic = sth_add_font(stash,fullFontFileName))) { b3Assert(0); return -1; } sprintf(fullFontFileName,"%s%s",fontPath,"DroidSerif-Bold.ttf"); if (!(droidBold = sth_add_font(stash,fullFontFileName))) { b3Assert(0); return -1; } err = glGetError(); b3Assert(err==GL_NO_ERROR); sprintf(fullFontFileName,"%s%s",fontPath,"DroidSansJapanese.ttf"); if (!(droidJapanese = sth_add_font(stash,fullFontFileName))) { b3Assert(0); return -1; } err = glGetError(); b3Assert(err==GL_NO_ERROR); #else//LOAD_FONT_FROM_FILE char* data2 = OpenSansData; unsigned char* data = (unsigned char*) data2; if (!(droidRegular = sth_add_font_from_memory(stash, data))) { printf("error!\n"); } #endif//LOAD_FONT_FROM_FILE while (!window->requestedExit()) { GLint err = glGetError(); b3Assert(err==GL_NO_ERROR); // glClearColor(0.5f,0.5f,0.5f,1.f); err = glGetError(); b3Assert(err==GL_NO_ERROR); window->startRendering(); err = glGetError(); b3Assert(err==GL_NO_ERROR); glClearColor(1,1,1,1);//.4, .4, 0.4, 1.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //display(); err = glGetError(); b3Assert(err==GL_NO_ERROR); if (1) { B3_PROFILE("font stash rendering"); // Update and render glEnable(GL_BLEND); err = glGetError(); b3Assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); err = glGetError(); b3Assert(err==GL_NO_ERROR); err = glGetError(); b3Assert(err==GL_NO_ERROR); glDisable(GL_DEPTH_TEST); err = glGetError(); b3Assert(err==GL_NO_ERROR); //glColor4ub(255,0,0,255); err = glGetError(); b3Assert(err==GL_NO_ERROR); glEnable(GL_BLEND); err = glGetError(); b3Assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); err = glGetError(); b3Assert(err==GL_NO_ERROR); sx = 0; sy = height; sth_begin_draw(stash); display(); dx = sx; dy = sy; static int once=0; //sth_draw_text(stash, droidRegular,12.f, dx, dy-50, "How does this OpenGL True Type font look? ", &dx,width,height); int spacing = 512; if (1) for (int i=20;i<=110;i+=12) { char txt[512]; sprintf(txt,"%d. The quick brown fox jumped over the lazy dog. 1234567890",i); sth_draw_text(stash, droidRegular,i, 10, dy-spacing, txt, &dx,width,height); spacing-=i; } err = glGetError(); b3Assert(err==GL_NO_ERROR); if (0) for (int i=0;i<1;i++) { dx = sx; if (once!=1) { //need to save this file as UTF-8 without signature, codepage 650001 in Visual Studio err = glGetError(); b3Assert(err==GL_NO_ERROR); //sth_draw_text(stash, droidJapanese,16.f, dx, dy-36, (const char*) "\xE7\xA7\x81\xE3\x81\xAF\xE3\x82\xAC\xE3\x83\xA9\xE3\x82\xB9\xE3\x82\x92\xE9\xA3\x9F\xE3\x81\xB9\xE3\x82\x89\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x99\xE3\x80\x82",&dx, // width,height);//はabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+=?/\][{}.,<>`~@#$%^", &dx); // sth_draw_text(stash, droidJapanese,32.f, dx, dy, (const char*) "私はガラスを食べられます。それは私を傷つけません。",&dx);//はabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+=?/\][{}.,<>`~@#$%^", &dx); dx = sx; err = glGetError(); b3Assert(err==GL_NO_ERROR); sth_flush_draw(stash); dx=0; sth_draw_text(stash, droidRegular,14.f, dx, dy-80, "How does this OpenGL True Type font look? ", &dx,width,height); dx=0; dy-=30; //sth_draw_text(stash, droidRegular,16.f, dx, dy-80, "Profile How does this OpenGL True Type font look? ", &dx,width,height); dx=0; dy-=30; sth_draw_text(stash, droidRegular,16.f, dx, dy-80, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", &dx,width,height); dx=0; dy-=30; sth_draw_text(stash, droidRegular,16.f, dx, dy-80, "!@#$%^abcdefghijklmnopqrstuvwxyz", &dx,width,height); dx=0; // sth_draw_text(stash, droidRegular,16.f, dx, dy-42, "aph OpenGL Profile aCABCabdabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^", &dx,width,height); //sth_draw_text(stash, droidRegular,16.f, dx, dy-42, "aph OpenGL Profile aCABCabdabcdefghijlkmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^", &dx,width,height); sth_flush_draw(stash); err = glGetError(); b3Assert(err==GL_NO_ERROR); } else { dx = sx; dy = height; err = glGetError(); b3Assert(err==GL_NO_ERROR); sth_draw_texture(stash, droidRegular, 16.f, 0, 0,width,height, "a", &dx); err = glGetError(); b3Assert(err==GL_NO_ERROR); dumpTextureToPng(fontTextureWidth, fontTextureHeight,"newPic.png"); } once++; } err = glGetError(); b3Assert(err==GL_NO_ERROR); sth_end_draw(stash); glEnable(GL_DEPTH_TEST); err = glGetError(); b3Assert(err==GL_NO_ERROR); //glFinish(); } err = glGetError(); b3Assert(err==GL_NO_ERROR); window->endRendering(); err = glGetError(); b3Assert(err==GL_NO_ERROR); { glFinish(); } static bool printStats = true; if (printStats && !pauseSimulation) { static int count = 0; count--; if (count<0) { count = 100; // b3ProfileManager::dumpAll(); //printStats = false; } else { // printf("."); } } err = glGetError(); b3Assert(err==GL_NO_ERROR); } #ifdef _WIN32 sth_delete(stash); #ifdef LOAD_FONT_FROM_FILE free(data); #endif //LOAD_FONT_FROM_FILE #endif // render.CleanupShaders(); window->closeWindow(); delete window; return 0; }
int main(int argc, char* argv[]) { b3SetCustomPrintfFunc(myprintf); b3Vector3 test(1,2,3); test.x = 1; test.y = 4; printf("main start"); b3CommandLineArgs args(argc,argv); ParticleDemo::ConstructionInfo ci; if (args.CheckCmdLineFlag("help")) { Usage(); return 0; } args.GetCmdLineArgument("selected_demo",selectedDemo); if (args.CheckCmdLineFlag("new_batching")) { useNewBatchingKernel = true; } bool benchmark=args.CheckCmdLineFlag("benchmark"); dump_timings=args.CheckCmdLineFlag("dump_timings"); ci.useOpenCL = !args.CheckCmdLineFlag("disable_opencl"); ci.m_useConcaveMesh = true;//args.CheckCmdLineFlag("use_concave_mesh"); if (ci.m_useConcaveMesh) { enableExperimentalCpuConcaveCollision = true; } args.GetCmdLineArgument("cl_device", ci.preferredOpenCLDeviceIndex); args.GetCmdLineArgument("cl_platform", ci.preferredOpenCLPlatformIndex); args.GetCmdLineArgument("x_dim", ci.arraySizeX); args.GetCmdLineArgument("y_dim", ci.arraySizeY); args.GetCmdLineArgument("z_dim", ci.arraySizeZ); args.GetCmdLineArgument("x_gap", ci.gapX); args.GetCmdLineArgument("y_gap", ci.gapY); args.GetCmdLineArgument("z_gap", ci.gapZ); #ifndef B3_NO_PROFILE b3ProfileManager::Reset(); #endif //B3_NO_PROFILE window = new b3gDefaultOpenGLWindow(); b3gWindowConstructionInfo wci(g_OpenGLWidth,g_OpenGLHeight); window->createWindow(wci); window->setResizeCallback(MyResizeCallback); window->setMouseMoveCallback(MyMouseMoveCallback); window->setMouseButtonCallback(MyMouseButtonCallback); window->setKeyboardCallback(MyKeyboardCallback); window->setWindowTitle("Bullet 3.x GPU Rigid Body http://bulletphysics.org"); printf("-----------------------------------------------------\n"); #ifndef __APPLE__ glewInit(); #endif gui = new GwenUserInterface(); printf("started GwenUserInterface"); GLPrimitiveRenderer prim(g_OpenGLWidth,g_OpenGLHeight); stash = initFont(&prim); gui->init(g_OpenGLWidth,g_OpenGLHeight,stash,window->getRetinaScale()); printf("init fonts"); gui->setToggleButtonCallback(MyButtonCallback); gui->registerToggleButton(MYPAUSE,"Pause"); gui->registerToggleButton(MYPROFILE,"Profile"); gui->registerToggleButton(MYRESET,"Reset"); int numItems = sizeof(allDemos)/sizeof(ParticleDemo::CreateFunc*); demoNames.clear(); for (int i=0;i<numItems;i++) { GpuDemo* demo = allDemos[i](); demoNames.push_back(demo->getName()); delete demo; } gui->registerComboBox(MYCOMBOBOX1,numItems,&demoNames[0]); gui->setComboBoxCallback(MyComboBoxCallback); do { bool syncOnly = false; gReset = false; static bool once=true; glClearColor(1,0,0,1); glClear(GL_COLOR_BUFFER_BIT); { window->startRendering(); glFinish(); float color[4] = {1,1,1,1}; prim.drawRect(0,0,200,200,color); float retinaScale = 1; float x = 10; float y=220; float dx=0; if (1) { B3_PROFILE("font sth_draw_text"); glEnable(GL_BLEND); GLint err = glGetError(); assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); err = glGetError(); assert(err==GL_NO_ERROR); glDisable(GL_DEPTH_TEST); err = glGetError(); assert(err==GL_NO_ERROR); glDisable(GL_CULL_FACE); sth_begin_draw(stash); sth_flush_draw(stash); sth_draw_text(stash, droidRegular,20.f, x, y, "Non-retina font rendering !@#$", &dx,g_OpenGLWidth,g_OpenGLHeight,0,1);//retinaScale); if (retinaScale!=1.f) sth_draw_text(stash, droidRegular,20.f*retinaScale, x, y+20, "Retina font rendering!@#$", &dx,g_OpenGLWidth,g_OpenGLHeight,0,retinaScale); sth_flush_draw(stash); sth_end_draw(stash); } gui->draw(g_OpenGLWidth,g_OpenGLHeight); window->endRendering(); glFinish(); } once=false; // OpenGL3CoreRenderer render; glClearColor(0,1,0,1); glClear(GL_COLOR_BUFFER_BIT); window->endRendering(); glFinish(); window->setWheelCallback(b3DefaultWheelCallback); { GpuDemo* demo = allDemos[selectedDemo](); // demo->myinit(); bool useGpu = false; int maxObjectCapacity=128*1024; ci.m_instancingRenderer = new GLInstancingRenderer(maxObjectCapacity);//render.getInstancingRenderer(); ci.m_window = window; ci.m_gui = gui; ci.m_instancingRenderer->init(); ci.m_instancingRenderer->InitShaders(); ci.m_primRenderer = &prim; // render.init(); demo->initPhysics(ci); printf("-----------------------------------------------------\n"); FILE* csvFile = 0; FILE* detailsFile = 0; if (benchmark) { gPause = false; char prefixFileName[1024]; char csvFileName[1024]; char detailsFileName[1024]; b3OpenCLDeviceInfo info; b3OpenCLUtils::getDeviceInfo(demo->getInternalData()->m_clDevice,&info); //todo: move this time stuff into the Platform/Window class #ifdef _WIN32 SYSTEMTIME time; GetLocalTime(&time); char buf[1024]; DWORD dwCompNameLen = 1024; if (0 != GetComputerName(buf, &dwCompNameLen)) { printf("%s", buf); } else { printf("unknown", buf); } sprintf(prefixFileName,"%s_%s_%s_%d_%d_%d_date_%d-%d-%d_time_%d-%d-%d",info.m_deviceName,buf,demoNames[selectedDemo],ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ,time.wDay,time.wMonth,time.wYear,time.wHour,time.wMinute,time.wSecond); #else timeval now; gettimeofday(&now,0); struct tm* ptm; ptm = localtime (&now.tv_sec); char buf[1024]; #ifdef __APPLE__ sprintf(buf,"MacOSX"); #else sprintf(buf,"Unix"); #endif sprintf(prefixFileName,"%s_%s_%s_%d_%d_%d_date_%d-%d-%d_time_%d-%d-%d",info.m_deviceName,buf,demoNames[selectedDemo],ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ, ptm->tm_mday, ptm->tm_mon+1, ptm->tm_year+1900, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); #endif sprintf(csvFileName,"%s.csv",prefixFileName); sprintf(detailsFileName,"%s.txt",prefixFileName); printf("Open csv file %s and details file %s\n", csvFileName,detailsFileName); //GetSystemTime(&time2); csvFile=fopen(csvFileName,"w"); detailsFile = fopen(detailsFileName,"w"); if (detailsFile) defaultOutput = detailsFile; //if (f) // fprintf(f,"%s (%dx%dx%d=%d),\n", g_deviceName,ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ,ci.arraySizeX*ci.arraySizeY*ci.arraySizeZ); } fprintf(defaultOutput,"Demo settings:\n"); fprintf(defaultOutput," SelectedDemo=%d, demoname = %s\n", selectedDemo, demo->getName()); fprintf(defaultOutput," x_dim=%d, y_dim=%d, z_dim=%d\n",ci.arraySizeX,ci.arraySizeY,ci.arraySizeZ); fprintf(defaultOutput," x_gap=%f, y_gap=%f, z_gap=%f\n",ci.gapX,ci.gapY,ci.gapZ); fprintf(defaultOutput,"\nOpenCL settings:\n"); fprintf(defaultOutput," Preferred cl_device index %d\n", ci.preferredOpenCLDeviceIndex); fprintf(defaultOutput," Preferred cl_platform index%d\n", ci.preferredOpenCLPlatformIndex); fprintf(defaultOutput,"\n"); b3OpenCLUtils::printPlatformInfo( demo->getInternalData()->m_platformId); fprintf(defaultOutput,"\n"); b3OpenCLUtils::printDeviceInfo( demo->getInternalData()->m_clDevice); fprintf(defaultOutput,"\n"); do { GLint err = glGetError(); assert(err==GL_NO_ERROR); b3ProfileManager::Reset(); b3ProfileManager::Increment_Frame_Counter(); // render.reshape(g_OpenGLWidth,g_OpenGLHeight); ci.m_instancingRenderer->resize(g_OpenGLWidth,g_OpenGLHeight); prim.setScreenSize(g_OpenGLWidth,g_OpenGLHeight); window->startRendering(); glClearColor(0.6,0.6,0.6,1); glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); glEnable(GL_DEPTH_TEST); if (!gPause) { B3_PROFILE("clientMoveAndDisplay"); demo->clientMoveAndDisplay(); } else { } { B3_PROFILE("renderScene"); demo->renderScene(); } err = glGetError(); assert(err==GL_NO_ERROR); /*if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getNumCollisionObjects()) { B3_PROFILE("renderPhysicsWorld"); b3AlignedObjectArray<b3CollisionObject*> arr = demo->getDynamicsWorld()->getCollisionObjectArray(); b3CollisionObject** colObjArray = &arr[0]; render.renderPhysicsWorld(demo->getDynamicsWorld()->getNumCollisionObjects(),colObjArray, syncOnly); syncOnly = true; } */ { B3_PROFILE("gui->draw"); gui->draw(g_OpenGLWidth,g_OpenGLHeight); } err = glGetError(); assert(err==GL_NO_ERROR); { B3_PROFILE("window->endRendering"); window->endRendering(); } err = glGetError(); assert(err==GL_NO_ERROR); { B3_PROFILE("glFinish"); } if (dump_timings) { b3ProfileManager::dumpAll(stdout); } if (csvFile) { static int frameCount=0; if (frameCount>0) { DumpSimulationTime(csvFile); if (detailsFile) { fprintf(detailsFile,"\n==================================\nFrame %d:\n", frameCount); b3ProfileManager::dumpAll(detailsFile); } } if (frameCount>=102) window->setRequestExit(); frameCount++; } } while (!window->requestedExit() && !gReset); demo->exitPhysics(); b3ProfileManager::CleanupMemory(); delete demo; if (detailsFile) { fclose(detailsFile); detailsFile=0; } if (csvFile) { fclose(csvFile); csvFile=0; } } } while (gReset); gui->setComboBoxCallback(0); delete gui; gui=0; window->closeWindow(); delete window; window = 0; return 0; }
void SimpleOpenGL3App::drawText3D( const char* txt, float worldPosX, float worldPosY, float worldPosZ, float size1) { B3_PROFILE("SimpleOpenGL3App::drawText3D"); float viewMat[16]; float projMat[16]; CommonCameraInterface* cam = m_instancingRenderer->getActiveCamera(); cam->getCameraViewMatrix(viewMat); cam->getCameraProjectionMatrix(projMat); float camPos[4]; cam->getCameraPosition(camPos); //b3Vector3 cp= b3MakeVector3(camPos[0],camPos[2],camPos[1]); //b3Vector3 p = b3MakeVector3(worldPosX,worldPosY,worldPosZ); //float dist = (cp-p).length(); //float dv = 0;//dist/1000.f; // //printf("str = %s\n",unicodeText); float dx=0; //int measureOnly=0; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); int viewport[4]={0,0,m_instancingRenderer->getScreenWidth(),m_instancingRenderer->getScreenHeight()}; float posX = 450.f; float posY = 100.f; float winx,winy, winz; if (!projectWorldCoordToScreen(worldPosX, worldPosY, worldPosZ,viewMat,projMat,viewport,&winx, &winy, &winz)) { return; } posX = winx; posY = m_instancingRenderer->getScreenHeight()/2+(m_instancingRenderer->getScreenHeight()/2)-winy; if (0)//m_useTrueTypeFont) { bool measureOnly = false; float fontSize= 32;//64;//512;//128; sth_draw_text(m_data->m_fontStash, m_data->m_droidRegular,fontSize,posX,posY, txt,&dx, this->m_instancingRenderer->getScreenWidth(),this->m_instancingRenderer->getScreenHeight(),measureOnly,m_window->getRetinaScale()); sth_end_draw(m_data->m_fontStash); sth_flush_draw(m_data->m_fontStash); } else { //float width = 0.f; int pos=0; //float color[]={0.2f,0.2,0.2f,1.f}; glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,m_data->m_largeFontTextureId); //float width = r.x; //float extraSpacing = 0.; float startX = posX; float startY = posY-g_DefaultLargeFont->m_CharHeight*size1; while (txt[pos]) { int c = txt[pos]; //r.h = g_DefaultNormalFont->m_CharHeight; //r.w = g_DefaultNormalFont->m_CharWidth[c]+extraSpacing; float endX = startX+g_DefaultLargeFont->m_CharWidth[c]*size1; float endY = posY; float currentColor[]={1.f,0.2,0.2f,1.f}; // m_primRenderer->drawTexturedRect(startX, startY, endX, endY, currentColor,g_DefaultLargeFont->m_CharU0[c],g_DefaultLargeFont->m_CharV0[c],g_DefaultLargeFont->m_CharU1[c],g_DefaultLargeFont->m_CharV1[c]); float u0 = g_DefaultLargeFont->m_CharU0[c]; float u1 = g_DefaultLargeFont->m_CharU1[c]; float v0 = g_DefaultLargeFont->m_CharV0[c]; float v1 = g_DefaultLargeFont->m_CharV1[c]; float color[4] = {currentColor[0],currentColor[1],currentColor[2],currentColor[3]}; float x0 = startX; float x1 = endX; float y0 = startY; float y1 = endY; int screenWidth = m_instancingRenderer->getScreenWidth(); int screenHeight = m_instancingRenderer->getScreenHeight(); float z = 2.f*winz-1.f;//*(far float identity[16]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; PrimVertex vertexData[4] = { PrimVertex(PrimVec4(-1.f+2.f*x0/float(screenWidth), 1.f-2.f*y0/float(screenHeight), z, 1.f ), PrimVec4( color[0], color[1], color[2], color[3] ) ,PrimVec2(u0,v0)), PrimVertex(PrimVec4(-1.f+2.f*x0/float(screenWidth), 1.f-2.f*y1/float(screenHeight), z, 1.f ), PrimVec4( color[0], color[1], color[2], color[3] ) ,PrimVec2(u0,v1)), PrimVertex(PrimVec4( -1.f+2.f*x1/float(screenWidth), 1.f-2.f*y1/float(screenHeight), z, 1.f ), PrimVec4(color[0], color[1], color[2], color[3]) ,PrimVec2(u1,v1)), PrimVertex(PrimVec4( -1.f+2.f*x1/float(screenWidth), 1.f-2.f*y0/float(screenHeight), z, 1.f ), PrimVec4( color[0], color[1], color[2], color[3] ) ,PrimVec2(u1,v0)) }; m_primRenderer->drawTexturedRect3D(vertexData[0],vertexData[1],vertexData[2],vertexData[3],identity,identity,false); //DrawTexturedRect(0,r,g_DefaultNormalFont->m_CharU0[c],g_DefaultNormalFont->m_CharV0[c],g_DefaultNormalFont->m_CharU1[c],g_DefaultNormalFont->m_CharV1[c]); // DrawFilledRect(r); startX = endX; //startY = endY; pos++; } glBindTexture(GL_TEXTURE_2D,0); } glDisable(GL_BLEND); }