void text::render() const{ const char * p = this->m_text.c_str(); glDisable( GL_DEPTH_TEST ) ; // also disable the depth test so renders on top glPushMatrix(); glTranslatef(this->m_origin.x(), this->m_origin.y(), this->m_origin.layer()); glScalef(m_size, m_size, 1); //font size //glRotatef(10.0, 0, 0, 1); glColor4f(colorR(), colorG(), colorB(), colorA()); do glutStrokeCharacter( GLUT_STROKE_ROMAN, *p ); while( *(++p) ) ; //GLUT_STROKE_MONO_ROMAN fix width glPopMatrix(); glEnable( GL_DEPTH_TEST ) ; // Turn depth testing back on }
void ofApp::update() { kinect.update(); if(kinect.isFrameNew()) { float* distancePixels = kinect.getDistancePixels(); // distance in millimeters unsigned char* resultPixels = result.getPixels(); int n = kinect.getWidth() * kinect.getHeight(); float nearThreshold = panel.getValueF("nearThreshold"); float farThreshold = panel.getValueF("farThreshold"); int nearTarget, farTarget; bool threshold = panel.getValueB("threshold"); int thresholdLevel = (nearTarget + farTarget) / 2; bool nearWhite = panel.getValueB("nearWhite"); if(nearWhite) { nearTarget = 255; farTarget = 0; } else { nearTarget = 0; farTarget = 255; } if(nearThreshold != farThreshold) { for(int i = 0; i < n; i++) { float cur = distancePixels[i]; if(cur != 0) { // only remap nonzeros // this code will threshold data to white or black if(threshold) { if(cur > thresholdLevel) { if(nearWhite) { cur = 0; } else { cur = 255; } } else { if(nearWhite) { cur = 255; } else { cur = 0; } } } // alternatively, just remap between 0 and 255 else { cur = ofMap(cur, nearThreshold, farThreshold, nearTarget, farTarget, true); } } resultPixels[i] = cur; } } result.update(); } //////////////////////////////////////cv////////////////////////////////////////////// // ofBackground(100,100,100); grayImage.setFromPixels(result.getPixels(), 640,480); // grayBg = grayImage; // the = sign copys the pixels from grayImage into grayBg // take the abs value of the difference between background and incoming and then threshold: grayDiff.absDiff(grayBg, grayImage); grayDiff.threshold(threshold); grayDiff.blur(5); // find contours which are between the size of 20 pixels and 1/3 the w*h pixels. // also, find holes is set to true so we will get interior contours as well.... contourFinder.findContours(grayDiff, 20, (640,480)/3, 10, true); // find holes // we are dealing with 4 images // image a, b, // image mix // and the greysacale image: // get the pixels unsigned char * grayPixels = grayDiff.getPixels(); unsigned char * colorPixelsA = back.getPixels(); unsigned char * colorPixelsB = vidPlayer.getPixels(); unsigned char * mixPixels = mix.getPixels(); for (int i = 0; i < 640*480; i++){ // get the color from each color image. ofColor colorA( colorPixelsA[i * 3], colorPixelsA[i * 3 + 1], colorPixelsA[i * 3 + 2]); ofColor colorB( colorPixelsB[i * 3], colorPixelsB[i * 3 + 1], colorPixelsB[i * 3 + 2]); // turn grayscale into a pct: float pct = ofMap(grayPixels[i], 0, 255, 0,1); // mix the two colors based on pct: ofColor colorMix = colorA * (1-pct) + colorB * pct; // set the color of the pixel in the mix image to the new mixed color mixPixels[i * 3] = colorMix.r; mixPixels[i * 3+1] = colorMix.g; mixPixels[i * 3+2] = colorMix.b; } // update the mix image mix.update(); }
//------------------------------------------------------------------------ void CVehicleMovementStdBoat::Update(const float deltaTime) { CVehicleMovementBase::Update(deltaTime); SetAnimationSpeed(eVMA_Engine, abs(m_rpmScaleSgn)); if (m_inWater) { SetSoundParam(eSID_Run, "slip", 0.2f*abs(m_localSpeed.x)); } #if ENABLE_VEHICLE_DEBUG if (IsProfilingMovement() && g_pGameCVars->v_profileMovement != 2) { IEntity* pEntity = m_pVehicle->GetEntity(); const Matrix34& wTM = pEntity->GetWorldTM(); Matrix34 wTMInv = wTM.GetInvertedFast(); const SVehiclePhysicsStatus* physStatus = &m_physStatus[k_mainThread]; Vec3 localW = physStatus->q * physStatus->w; float speed = physStatus->v.len2() > 0.001f ? physStatus->v.len() : 0.f; float speedRatio = min(1.f, speed/(m_maxSpeed*m_factorMaxSpeed)); float absPedal = abs(m_movementAction.power); float absSteer = abs(m_movementAction.rotateYaw); static const float fSubmergedMin = 0.01f; static const float fWaterLevelMaxDiff = 0.15f; // max allowed height difference between propeller center and water level Vec3 worldPropPos = wTM * m_pushOffset; float waterLevelWorld = gEnv->p3DEngine->GetWaterLevel( &worldPropPos ); float fWaterLevelDiff = worldPropPos.z - waterLevelWorld; // wave stuff float waveFreq = 1.f; waveFreq += 3.f*speedRatio; float kx = m_waveIdleStrength.x*(m_waveRandomMult+0.3f) * (1.f-speedRatio + m_waveSpeedMult*speedRatio); float ky = m_waveIdleStrength.y * (1.f - 0.5f*absPedal - 0.5f*absSteer); Vec3 waveLoc = m_massOffset; waveLoc.y += speedRatio*min(0.f, m_pushOffset.y-m_massOffset.y); waveLoc = wTM * waveLoc; IRenderer* pRenderer = gEnv->pRenderer; static float color[4] = {1,1,1,1}; float colorRed[4] = {1,0,0,1}; float colorGreen[4] = {0,1,0,1}; float y=50.f, step1=15.f, step2=20.f, size1=1.3f, size2=1.5f; pRenderer->Draw2dLabel(5.0f, y, size2, color, false, "Boat movement"); pRenderer->Draw2dLabel(5.0f, y+=step2, size1, color, false, "Speed: %.1f (%.1f km/h)", speed, speed*3.6f); pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "LocalW.z norm: %.2f", abs(localW.z)/m_turnRateMax); if (m_velLift > 0.f) { pRenderer->Draw2dLabel(5.0f, y+=step2, size1, m_lifted ? colorGreen : color, false, m_lifted ? "Lifted" : "not lifted"); //pRenderer->Draw2dLabel(5.0f, y+=step2, size1, color, false, "Impulse lift: %.0f", liftImp.impulse.len()); } pRenderer->Draw2dLabel(5.0f, y+=step1, size1, physStatus->submergedFraction > fSubmergedMin ? color : colorRed, false, "Submerged: %.2f", physStatus->submergedFraction); pRenderer->Draw2dLabel(5.0f, y+=step1, size1, fWaterLevelDiff < fWaterLevelMaxDiff ? color : colorRed, false, "WaterLevel: %.2f (max: %.2f)", fWaterLevelDiff, fWaterLevelMaxDiff); pRenderer->Draw2dLabel(5.0f, y+=step2, size2, color, false, "Driver input"); pRenderer->Draw2dLabel(5.0f, y+=step2, size1, color, false, "power: %.2f", m_movementAction.power); pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "steer: %.2f", m_movementAction.rotateYaw); pRenderer->Draw2dLabel(5.0f, y+=step2, size2, color, false, "Propelling"); //pRenderer->Draw2dLabel(5.0f, y+=step2, size1, color, false, "turnAccel (norm/real): %.2f / %.2f", turnAccelNorm, turnAccel); //pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "Impulse acc: %.0f", linearImp.impulse.len()); //pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "Impulse steer/damp: %.0f", angularImp.angImpulse.len()); //pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "Impulse corner: %.0f", dampImp.impulse.len()); pRenderer->Draw2dLabel(5.0f, y+=step2, size2, color, false, "Waves"); pRenderer->Draw2dLabel(5.0f, y+=step2, size1, color, false, "timer: %.1f", m_waveTimer); pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "frequency: %.2f", waveFreq); pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "random: %.2f", m_waveRandomMult); pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "kX: %.2f", kx); pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "kY: %.2f", ky); if (Boosting()) pRenderer->Draw2dLabel(5.0f, y+=step1, size1, color, false, "Boost: %.2f", m_boostCounter); IRenderAuxGeom* pGeom = pRenderer->GetIRenderAuxGeom(); ColorB colorB(0,255,0,255); pRenderer->DrawLabel(worldPropPos, 1.3f, "WL: %.2f", waterLevelWorld); pGeom->DrawSphere(worldPropPos, 0.15f, colorB); pGeom->DrawSphere(waveLoc, 0.25f, colorB); pGeom->DrawLine(waveLoc, colorB, waveLoc+Vec3(0,0,2), colorB); // impulses //DrawImpulse(linearImp, Vec3(0,0,1), 3.f/deltaTime, ColorB(255,0,0,255)); //DrawImpulse(angularImp, Vec3(0,0,1), 2.f/deltaTime, ColorB(128,0,0,255)); //DrawImpulse(liftImp, Vec3(0,0,6), 2.f/deltaTime, ColorB(0,0,255,255)); } #endif }