//瞧,这是以前从未见过的最短的绘制程序,有很棒的视觉效果! //我们调用RenderToTexture 函数。幸亏我们视口改变这个函数才着色被拉伸的弹簧。 对于我们的纹理拉伸的弹簧被着色,并且这些缓冲器被清除。 //我们之后绘制“真正的”弹簧 (你在屏幕上看到的3D实体) 通过调用 ProcessHelix( )。 //最后我们在弹簧前面绘制一些混合的方块。有织纹的方块将被拉伸以适应在真正的3D弹簧 //上面。 void MyGLWidget::paintGL() { glClearColor(0.0f, 0.0f, 0.0f, 0.5);// 将清晰的颜色设定为黑色 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓冲器 glLoadIdentity();// 重置视图 renderToTexture();// 着色纹理 processHelix();// 绘制我们的螺旋 drawBlur(25,0.02f);// 绘制模糊效果 }
void BrushToolEdit::drawInner(const QPoint &pt, float strength) { float fixedStrength = params.strength; strength *= fixedStrength; auto color = params.color; std::array<int, 3> colorParts = Terrain::expandColor(color); __m128 colorMM = _mm_setr_ps(colorParts[0], colorParts[1], colorParts[2], 0); SseRoundingModeScope roundingModeScope(_MM_ROUND_NEAREST); (void) roundingModeScope; switch (tool->type()) { case BrushType::Blur: drawBlur(pt, std::min(strength / 5.f, 4.f)); break; case BrushType::Smoothen: drawSmoothen(pt, std::min(strength / 5.f, 4.f)); break; case BrushType::Raise: case BrushType::Lower: if (tool->type() == BrushType::Lower) { fixedStrength = -fixedStrength; strength = -strength; } switch (params.pressureMode) { case BrushPressureMode::AirBrush: strength *= 3.f; drawRaiseLower(pt, [=](float ¤t, float before, float tip) { (void) before; current -= tip * strength; }); break; case BrushPressureMode::Constant: if (tool->type() == BrushType::Lower) { drawRaiseLower(pt, [=](float ¤t, float before, float tip) { current = Terrain::quantizeOne(std::max(current, before - tip * fixedStrength)); }); } else { drawRaiseLower(pt, [=](float ¤t, float before, float tip) { current = Terrain::quantizeOne(std::min(current, before - tip * fixedStrength)); }); } break; case BrushPressureMode::Adjustable: drawRaiseLower(pt, [=](float ¤t, float before, float tip) { current = Terrain::quantizeOne(before - tip * strength); }); break; } break; case BrushType::Paint: switch (params.pressureMode) { case BrushPressureMode::AirBrush: strength = 1.f - std::exp2(-strength); drawColor(pt, [=](quint32 ¤t, quint32 before, float tip) { (void) before; // convert current color to FP32 auto currentMM = _mm_castps_si128(_mm_load_ss(reinterpret_cast<float *>(¤t))); currentMM = _mm_unpacklo_epi8(currentMM, _mm_setzero_si128()); currentMM = _mm_unpacklo_epi16(currentMM, _mm_setzero_si128()); auto currentMF = _mm_cvtepi32_ps(currentMM); auto factor = _mm_set1_ps(tip * strength); // blend auto diff = _mm_sub_ps(colorMM, currentMF); diff = _mm_mul_ps(diff, factor); currentMF = _mm_add_ps(currentMF, diff); // convert to RGB32 currentMF = _mm_add_ps(currentMF, globalDitherSampler.getM128()); currentMM = _mm_cvttps_epi32(currentMF); currentMM = _mm_packs_epi32(currentMM, currentMM); currentMM = _mm_packus_epi16(currentMM, currentMM); _mm_store_ss(reinterpret_cast<float *>(¤t), _mm_castsi128_ps(currentMM)); }); break; case BrushPressureMode::Constant: fixedStrength *= 0.01f; drawColor(pt, [=](quint32 ¤t, quint32 before, float tip) { // convert current color to FP32 auto currentMM = _mm_castps_si128(_mm_load_ss(reinterpret_cast<float *>(¤t))); currentMM = _mm_unpacklo_epi8(currentMM, _mm_setzero_si128()); currentMM = _mm_unpacklo_epi16(currentMM, _mm_setzero_si128()); auto currentMF = _mm_cvtepi32_ps(currentMM); // convert before color to FP32 auto beforeMM = _mm_setr_epi32(before, 0, 0, 0); beforeMM = _mm_unpacklo_epi8(beforeMM, _mm_setzero_si128()); beforeMM = _mm_unpacklo_epi16(beforeMM, _mm_setzero_si128()); auto beforeMF = _mm_cvtepi32_ps(beforeMM); // beforeMM = _mm_add_ps(beforeMM, globalDitherSampler.getM128()); // use "before" image to which way of color change is possible, and // compute possible range of result color auto diff = _mm_sub_ps(colorMM, beforeMF); auto factor = _mm_set1_ps(tip * fixedStrength); auto adddiff = _mm_mul_ps(diff, factor); beforeMF = _mm_add_ps(beforeMF, adddiff); auto diffDir = _mm_cmpgt_ps(diff, _mm_setzero_ps()); // compute output image auto out1 = _mm_max_ps(currentMF, beforeMF); auto out2 = _mm_min_ps(currentMF, beforeMF); currentMF = _mm_or_ps(_mm_and_ps(diffDir, out1), _mm_andnot_ps(diffDir, out2)); // convert to RGB32 currentMF = _mm_add_ps(currentMF, globalDitherSampler.getM128()); currentMM = _mm_cvttps_epi32(currentMF); currentMM = _mm_packs_epi32(currentMM, currentMM); currentMM = _mm_packus_epi16(currentMM, currentMM); _mm_store_ss(reinterpret_cast<float *>(¤t), _mm_castsi128_ps(currentMM)); }); break; case BrushPressureMode::Adjustable: strength *= 0.01f; drawColor(pt, [=](quint32 ¤t, quint32 before, float tip) { // convert before color to FP32 auto beforeMM = _mm_setr_epi32(before, 0, 0, 0); beforeMM = _mm_unpacklo_epi8(beforeMM, _mm_setzero_si128()); beforeMM = _mm_unpacklo_epi16(beforeMM, _mm_setzero_si128()); auto beforeMF = _mm_cvtepi32_ps(beforeMM); // blend auto diff = _mm_sub_ps(colorMM, beforeMF); auto factor = _mm_set1_ps(tip * strength); diff = _mm_mul_ps(diff, factor); beforeMF = _mm_add_ps(beforeMF, diff); // convert to RGB32 beforeMF = _mm_add_ps(beforeMF, globalDitherSampler.getM128()); beforeMM = _mm_cvttps_epi32(beforeMF); beforeMM = _mm_packs_epi32(beforeMM, beforeMM); beforeMM = _mm_packus_epi16(beforeMM, beforeMM); _mm_store_ss(reinterpret_cast<float *>(¤t), _mm_castsi128_ps(beforeMM)); }); break; } break; } }
//------------------------------------------ void SceneSpheres::drawScene() { glPointSize(2.0); AudioInput* input2 = ((VstPlugin*)effect)->audioInputs[2]; float level0 = input2->level; if (input2->hasBeenTriggered()) { sgn=sgn*-1; input2->updateTrigger(); } //drawBlur(1,1.0f,-0.02,0.15f); drawBlur(1,1.0f,sgn*0.02,1-level0*2.3f); float a = ((VstPlugin*)effect)->temps->getElapsedTime(); //gluLookAt(-20*cos(a),0,-20*sin(a),0,0,0,0,1,0); gluLookAt(0,5,-16,0,0,0,0,1,0); glEnable(GL_LIGHTING); glShadeModel(GL_FLAT); glPolygonMode(GL_FRONT_AND_BACK , GL_FILL); glPushMatrix(); glRotatef(50*a,0,1,0); objects3d[0]->draw(); glPopMatrix(); float s = 2.0; level8 = level8+((VstPlugin*)effect)->audioInputs[8]->level*15.0; glPushMatrix(); glTranslatef(0,-0.5,0); glRotatef(-180,0,1,0); for (int i = 0; i<2; i++) { glRotatef(180,0,1,0); glPushMatrix(); glRotatef(level8,0,0,1); glTranslatef(-8,0,0); glScalef(s,s,s); objects3d[1]->draw(); glRotatef(180,0,0,1); objects3d[1]->draw(); glPopMatrix(); } glPopMatrix(); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, SIZE, SIZE, 0); glPolygonMode(GL_FRONT_AND_BACK , GL_FILL); level4 = ((VstPlugin*)effect)->audioInputs[4]->level; if (attack <1 && level4>0.05) attack = attack + 0.25; else if (level4 < 0.05 && attack > 0) attack = attack - 0.25; c = level4*16.0; invert(0,0); }
//------------------------------------------ void SceneNurbs::drawScene() { glPointSize(5.0); float a = ((VstPlugin*)effect)->temps->getElapsedTime()*0.2; float level8 = ((VstPlugin*)effect)->audioInputs[8]->level; AudioInput* input8 = ((VstPlugin*)effect)->audioInputs[8]; level2 = level2 + ((VstPlugin*)effect)->audioInputs[2]->level*4.0; glPolygonMode(GL_FRONT_AND_BACK , GL_FILL); drawBlur(1,1.0f,0.02,1-level8*6.0f); glDisable(GL_LIGHTING); //gluLookAt(0,-15,-15,0,0,0,0,-sin(45.0),cos(45.0)); gluLookAt(-20*cos(a),9,-20*sin(a),0,0,0,0,1,0); if (input8->hasBeenTriggered()) { if (objects3d[0]->polmode == 0) { objects3d[0]->polmode = 1; objects3d[1]->polmode = 1; } else { objects3d[0]->polmode = 0; objects3d[1]->polmode = 0; } input8->updateTrigger(); } glPushMatrix(); glRotatef(level2,0,1,0); for (int g=0; g<6; g++) { glRotatef(60,0,1,0); glPushMatrix(); glTranslatef(0,0,-8); glRotatef(90,0,0,1); glLineWidth(2.0); objects3d[0]->draw(); glLineWidth(1.0); glPopMatrix(); } glPopMatrix(); //glRotatef(50*a,1,0,0); float s = 0.6; glScalef(s,s,s); objects3d[1]->draw(); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, SIZE, SIZE, 0); level4 = ((VstPlugin*)effect)->audioInputs[4]->level; /* if (level4*30.0 >1) c =1; else c = level4*30.0;*/ glPolygonMode(GL_FRONT_AND_BACK , GL_FILL); /*if (attack <1 && level4>0.05) attack = attack + 0.1; else if (level4 < 0.05 ) attack = 0;*/ c = level4*16.0; invert(0,2); }
//------------------------------------------ void SceneFlowers::drawScene() { //drawBlur(1,1.0,-0.02,0.15f); float a = ((VstPlugin*)effect)->temps->getElapsedTime(); dis = ((VstPlugin*)effect)->audioInputs[4]->level*0.3; gluLookAt(0,0,-2,0,0,0,0,1,0); int coef = 30; glPushMatrix(); //glRotatef(a*coef,0,1,0); glRotatef(45*cos(a)-90,0,1,0); glTranslatef(0,-0.4,0); glRotatef(45,0,0,1); glTranslatef(0,dis,0); objects3d[1]->draw(); glPopMatrix(); level2 = level2 + ((VstPlugin*)effect)->audioInputs[2]->level* 1.2; float s = 0.4 + 0.15*sin(level2); glPushMatrix(); glTranslatef(-0.8,0.15,0); glRotatef(a*coef*2,0,1,0); glTranslatef(-0.05,-0.1,0); glRotatef(45,0,0,1); glScalef(s,s,s); objects3d[0]->draw(); glPopMatrix(); glPushMatrix(); glTranslatef(0.8,0.15,0); glRotatef(a*coef*2,0,1,0); glTranslatef(-0.05,-0.1,0); glRotatef(45,0,0,1); glScalef(s,s,s); objects3d[0]->draw(); glPopMatrix(); objects3d[3]->draw(); AudioInput* input9 = ((VstPlugin*)effect)->audioInputs[9]; if (input9->hasBeenTriggered()) { if (objects3d[0]->polmode == 1) { objects3d[0]->polmode = 2; objects3d[1]->polmode = 1; } else { objects3d[0]->polmode = 1; objects3d[1]->polmode = 0; } input9->updateTrigger(); } glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, SIZE, SIZE, 0); AudioInput* input8 = ((VstPlugin*)effect)->audioInputs[8]; if (input8->hasBeenTriggered()) { if (kal == 3) kal = 0; else kal++ ; input8->updateTrigger(); } kalei(kal); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, SIZE, SIZE, 0); drawBlur(20,0.1,0.01f,0.01); }