コード例 #1
0
ファイル: myglwidget.cpp プロジェクト: Jornason/qt-opengl
//瞧,这是以前从未见过的最短的绘制程序,有很棒的视觉效果!
//我们调用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);// 绘制模糊效果
}
コード例 #2
0
ファイル: brushtool.cpp プロジェクト: BuildandShoot/terravox
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 &current, float before, float tip) {
                (void) before;
                current -= tip * strength;
            });
            break;
        case BrushPressureMode::Constant:
            if (tool->type() == BrushType::Lower) {
                drawRaiseLower(pt, [=](float &current, float before, float tip) {
                    current = Terrain::quantizeOne(std::max(current, before - tip * fixedStrength));
                });
            } else {
                drawRaiseLower(pt, [=](float &current, float before, float tip) {
                    current = Terrain::quantizeOne(std::min(current, before - tip * fixedStrength));
                });
            }
            break;
        case BrushPressureMode::Adjustable:
            drawRaiseLower(pt, [=](float &current, 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 &current, quint32 before, float tip) {
                (void) before;

                // convert current color to FP32
                auto currentMM = _mm_castps_si128(_mm_load_ss(reinterpret_cast<float *>(&current)));
                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 *>(&current), _mm_castsi128_ps(currentMM));
            });
            break;
        case BrushPressureMode::Constant:
            fixedStrength *= 0.01f;
            drawColor(pt, [=](quint32 &current, quint32 before, float tip) {
                // convert current color to FP32
                auto currentMM = _mm_castps_si128(_mm_load_ss(reinterpret_cast<float *>(&current)));
                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 *>(&current), _mm_castsi128_ps(currentMM));
            });
            break;
        case BrushPressureMode::Adjustable:
            strength *= 0.01f;
            drawColor(pt, [=](quint32 &current, 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 *>(&current), _mm_castsi128_ps(beforeMM));
            });
            break;
        }
        break;
    }

}
コード例 #3
0
//------------------------------------------
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);
	


}
コード例 #4
0
ファイル: SceneNurbs.cpp プロジェクト: vinz9/vstvisframework
//------------------------------------------
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);
}
コード例 #5
0
//------------------------------------------
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);

}