Exemple #1
0
void CRectangleSymbol::configure()
{
    m_vertices[0].vertex = glm::vec2(m_size.x, m_size.y);
    m_vertices[1].vertex = glm::vec2(m_size.x + m_size.z, m_size.y);
    m_vertices[2].vertex = glm::vec2(m_size.x + m_size.z, m_size.y + m_size.w);
    m_vertices[3].vertex = glm::vec2(m_size.x, m_size.y + m_size.w);

    m_vertices[0].uv =  glm::vec2(0.0f, 1.0f - 0.0f);
    m_vertices[1].uv =  glm::vec2(1.0f, 1.0f - 0.0f);
    m_vertices[2].uv =  glm::vec2(1.0f, 1.0f - 1.0f);
    m_vertices[3].uv =  glm::vec2(0.0f, 1.0f - 1.0f);

    CShader *shader = CShaderFactory::getInstance()->getShader("text");
    if (shader) {
        m_vao.genBuffer();
        m_vao.bind();

        m_vertexVBO.genBuffer();
        m_vertexVBO.setData(&m_vertices);

        shader->setAttribute("a_position", 2, 0, sizeof(CVertex2D));
        shader->setAttribute("a_uv", 2, 8, sizeof(CVertex2D));
//        shader->setAttribute("a_color", 3, 16, sizeof(CVertex2D));

        m_vao.disable();
    }
}
Exemple #2
0
IShader *WINAPI QERApp_Shader_ForName (const char *name)
{
  if (name == NULL || strlen (name) == 0)
  {
    // Hydra: This error can occur if the user loaded a map with/dropped an entity that
    // did not set a texture name "(r g b)" - check the entity definition loader

    g_FuncTable.m_pfnSysFPrintf (SYS_ERR, "FIXME: name == NULL || strlen(name) == 0 in QERApp_Shader_ForName\n");
    return QERApp_Shader_ForName (SHADER_NOT_FOUND);
  }
  // entities that should be represented with plain colors instead of textures
  // request a texture name with (r g b) (it's stored in their class_t)
  if (name[0] == '(')
  {
    return QERApp_ColorShader_ForName (name);
  }

  CShader *pShader = static_cast < CShader * >(QERApp_Try_Shader_ForName (name));
  if (pShader)
  {
    pShader->SetDisplayed (true);
    return pShader;
  }
  return QERApp_CreateShader_ForTextureName (name);
}
Exemple #3
0
void CScene::BuildObjects(ID3D11Device *pd3dDevice)
{
	CShader *pShader = new CShader();
	pShader->CreateShader(pd3dDevice);

	m_nObjects = 51;
	m_ppObjects = new CGameObject*[m_nObjects];
	//가로x세로x높이가 15x15x15인 정육면체 메쉬를 생성한다.
	CCubeMesh *pMesh = new CCubeMesh(pd3dDevice, 50.0f, 50.0f, 50.0f); // random color cube draw
	CRotatingObject *pObject = new CRotatingObject();
	//pObject->SetPosition(0, 0, 0);
	pObject->SetMesh(pMesh);
	pObject->SetShader(pShader);
	m_ppObjects[0] = pObject;


	for (int i = 1; i <= 50; ++i)
	{
		CCubeMesh *pMesh = new CCubeMesh(pd3dDevice, 5.0f, 5.0f, 5.0f); // random color cube draw
		CRotatingObject *pObject = new CRotatingObject();
		pObject->SetPosition(-10.0f, 0, 0);
		pObject->SetMovingDirection(D3DXVECTOR3(float(rand() % 10) / 100.f, float(rand() % 10) / 100.f, float(rand() % 10) / 100.f));
		pObject->SetMovingSpeed(0.03f);

		pObject->SetMesh(pMesh);
		pObject->SetShader(pShader);
		
		m_ppObjects[i] = pObject;
	}
}
Exemple #4
0
GfxContext::GfxContext() 
: m_TriangleProgram(nullptr)
{
    // TODO: Shouldn't be done in here! Move to client's code!

    auto cubeGeom = LoadGeometryFromObj("resources\\cube.obj", "cube");

    auto cube = shared_ptr<SceneObject>(new SceneObject());
    auto cube2 = shared_ptr<SceneObject>(new SceneObject());
    cube->Attributes.Geometry = cubeGeom;
    cube2->Attributes.Geometry = cubeGeom;

    cube2->Move(float3(0.0f, 3.0f, 0.0f));

    m_Scene.Add(cube);
    m_Scene.Add(cube2);

    CShader* fShader = new CShader(GL_FRAGMENT_SHADER, "resources/shaders/mvp.frag");
    CShader* vShader = new CShader(GL_VERTEX_SHADER, "resources/shaders/mvp.vert");

    fShader->Compile();
    vShader->Compile();

    m_TriangleProgram = new CProgram();
    m_TriangleProgram->Attach(fShader);
    m_TriangleProgram->Attach(vShader);
    m_TriangleProgram->Link();

    m_Textures["grass"] = LoadTextureDDS("resources/textures/test-rgb8-256b.dds");

    glEnable(GL_DEPTH_TEST);
}
Exemple #5
0
int WINAPI QERApp_LoadShadersFromDir (const char *path)
{
  int count = 0;
  // scan g_Shaders, and call QERApp_Shader_ForName for each in the given path
  // this will load the texture if needed and will set it in use..
  int nSize = g_Shaders.GetSize ();
  for (int i = 0; i < nSize; i++)
  {
    CShader *pShader = reinterpret_cast < CShader * >(g_Shaders[i]);
    if (strstr (pShader->getShaderFileName (), path) || strstr (pShader->getName (), path))
    {
      count++;
      // request the shader, this will load the texture if needed and set "inuse"
      //++timo FIXME: should we put an Activate member on CShader?
      // this QERApp_Shader_ForName call is a kind of hack
      IShader *pFoo = QERApp_Shader_ForName (pShader->getName ());
#ifdef _DEBUG
      // check we activated the right shader
      // NOTE: if there was something else loaded, the size of g_Shaders may have changed and strange behaviours are to be expected
      if (pFoo != pShader)
	Sys_Printf ("WARNING: unexpected pFoo != pShader in QERApp_LoadShadersFromDir\n");
#else
      pFoo = NULL;		// leo: shut up the compiler
#endif
    }
  }
  return count;
}
HRESULT CShaderManager::CreateShader(const SHADER_TYPE& eShader, const LPCTSTR pFileName)
{
	CShader* pShader = FindShader(eShader);

	if(pShader)
	{
		return S_OK;
	}

	switch(eShader)
	{
	case SHADER_DEFAULT:
		pShader = new CDefaultShader;
		break;
	default:
		break;
	}
	
	
	if(FAILED(pShader->Init(pFileName)))
	{
		return E_FAIL;
	}

	m_mapShader.insert(map<SHADER_TYPE, CShader*>::value_type(eShader, pShader));

	return S_OK;
}
    CShader* CCacheResourceManager::LoadShader(const std::string& name)
    {
        
        if(shaderResources.find(name) != shaderResources.end())
        {
#ifdef DEBUG
            std::cerr<<"CCacheResourceManager: [INFO] "<< name<<" loaded from cache.\n";
#endif
            return shaderResources.find(name)->second;
        }
        
        
        CShader* ptr = new CShader();
        string vshader = name;
        string pshader = name;
        StringManipulator::AddCharArrayToString(vshader, ".vsh");
        StringManipulator::AddCharArrayToString(pshader, ".fsh");
        
        if(!ptr->LoadShadersFromMemory(getContentFromPath(getPath(vshader)).c_str(),
                                       getContentFromPath(getPath(pshader)).c_str()))
        {
            std::cerr<< "CCacheResourceManager: [ERROR] failed to load shader: "<< name << "...<\n";
            delete ptr;
            return NULL;
        }
        
        shaderResources[name] = ptr;
        
#ifdef DEBUG
        std::cerr<< "CCacheResourceManager: [SUCCESS] "<<name <<" shader loaded...\n";
#endif
        
        return ptr;
    }
//---------------------------------------------------------------
// Purpose: 
//---------------------------------------------------------------
void CEntityTypeLight::Render( void )
{
	BaseClass::Render();

	if( IsSelected() )
	{
		CBaseGeometry *geom = GetRenderInterfaces()->GetRendererInterf()->GetLightList()->GetUnitSphere();
		CPointLight *light = GetRenderInterfaces()->GetRendererInterf()->GetLightList()->GetPointLight(m_lightIndex);

		//calculate light geometry scales
		float fMaxDist = light->GetDist();
		geom->SetScale(fMaxDist);
		geom->SetAbsPos(GetAbsCenter());
		geom->SetAbsAngles(GetAbsAngles());

		CShader *pShd = GetShaderManager()->GetActiveShader();
		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
		GetGLStateSaver()->Disable(GL_CULL_FACE);
		pShd->EnableTexturing(false);
		pShd->SetDrawColor(1, 1, 0, 1);
		geom->RenderNoTextureBufferOnly(false);
		pShd->SetDrawColor(1, 1, 1, 1);
		GetGLStateSaver()->Enable(GL_CULL_FACE);
		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	}
}
Exemple #9
0
IShader *WINAPI QERApp_ColorShader_ForName( const char *name ){
	CShader *pShader = new CShader();
	pShader->CreateColor( name );
	// hook it into the shader list
	pShader->IncRef();
	g_Shaders.Add( (void *) pShader );
	return pShader;
}
Exemple #10
0
bool CScene::RenderShadow()
{
	std::list<axelynx::Camera *>::const_iterator ci = camlist.begin();
	std::list<axelynx::Camera *>::const_iterator ei = camlist.end();

	CShadowPass::SetShadowShader(defShader_);
	CShadowPass::StartPass();

	for(;ci!=ei;++ci)
	{
		if((*ci)->isEnabled())
		{
			frame_++;
			(*ci)->Bind(zpassed?-1:0);
			CMaterial::Free(); //материал зависит от камеры
			if(zpassed)
			{
				CEarlyZ::StartRenderPass();
			}
			else
			{
				glDepthFunc(GL_LESS);
				glDepthMask(GL_TRUE);
			}
			for(int i=0;i<256;++i)
			{
				if(visible_groups_[i])
					scenegraph_[i]->Render(*ci);
			}
			(*ci)->UnBind();
			CMaterial::Free(); //материал зависит от камеры
		}
	}

	CShader *cs = CShader::Current();

	if(cs)
		cs->UnBind();

	for(int i=0;i<16;++i)
	{
		CTexture *ct = CTexture::Current(i);
		if(ct)
			ct->UnBind();
	}

	if(zpassed)
		CEarlyZ::EndRenderPass();

	zpassed = false;
	glDisable(GL_DEPTH_TEST);
	glDisable(GL_CULL_FACE);
	glDepthMask(GL_TRUE);

	CShadowPass::EndPass();

	return true;
}
Exemple #11
0
ERRCODE CRenderer::ProcessBufferQueue()
{
	if(!queueMeshes->empty()) //В очереди ждет один или более мешей
	{
		//Пишем буферы меша (RAM) в видеопамять
		PAIR_UINT pair = vbContainer->Write(queueMeshes->front()->GetBuffer(BUFFER_V)->GetType(),
											queueMeshes->front()->GetBuffer(BUFFER_V)->GetSize(),
											queueMeshes->front()->GetBuffer(BUFFER_V)->GetBuffer());

		PAIR_UINT indpair = vbContainer->Write(queueMeshes->front()->GetBuffer(BUFFER_I)->GetType(),
											queueMeshes->front()->GetBuffer(BUFFER_I)->GetSize(),
											queueMeshes->front()->GetBuffer(BUFFER_I)->GetBuffer());

		//Записываем координаты данных в видеопамяти
		queueMeshes->front()->SetBufferCoords(BUFFER_V, pair.x, pair.y, queueMeshes->front()->GetBuffer(BUFFER_V)->GetSize());
		queueMeshes->front()->SetBufferCoords(BUFFER_I, indpair.x, indpair.y, queueMeshes->front()->GetBuffer(BUFFER_I)->GetSize());
		//Меш готов для рендера, записываем ссылку на него в массив мешей
		CMesh* msh = queueMeshes->front();
		queueMeshes->pop();
		vecMeshes->push_back(msh);
		//Удаляем указатель на меш из очереди

		char* str = new char[50];
		sprintf(str, "Written vertex data into VBO\n");
		Log(str);
		delete [] str;
	}

	if(!queueTextures2D->empty())
	{
		//TODO: Сохранить текстуру в опенгл и отдать CTexture2D хендл(ID) на сохраненную текстуру
		CTexture2D* tex2D = queueTextures2D->front();
		GLuint iT;
		glGenTextures(1, &iT);
		glBindTexture(GL_TEXTURE_2D, iT);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex2D->GetWidth(), tex2D->GetHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, tex2D->GetPixels());
		glBindTexture(GL_TEXTURE_2D, 0);
		tex2D->SetTexture2Did(iT);

		queueTextures2D->pop();
		vecTextures2D->push_back(tex2D);
	}

	if(!queueShaders->empty())
	{
		CShader* shader = queueShaders->front();

		//TODO: Компилируем шейдер, отправляем ID в CShader
		shader->Compile();

		queueShaders->pop();
		vecShaders->push_back(shader);
		Log("Compiled shader program.\n");
	}
	return ERR_OK;
}
Exemple #12
0
// NOTE: case sensitivity
// although we store shader names with case information, Radiant does case insensitive searches
// (we assume there's no case conflict with the names)
CShader* CShaderArray::Shader_ForName( const char * name) const
{
	int i;
  for ( i = 0; i < CPtrArray::GetSize(); i++ )
	{
    CShader *pShader = static_cast<CShader*>(CPtrArray::GetAt(i));
		if (_stricmp(pShader->getName(), name) == 0)
			return pShader;
	}
	return NULL;
}
Exemple #13
0
void CRenderer::ProcessNode(CNode* node)
{
	std::vector<CNode*> *vec = node->GetNodeVector();

	//Обновляем нод, рендерим сущности
	//Log("Node is updated\n");
	glTranslatef(node->GetPosX(), node->GetPosY(), node->GetPosZ());

	for(int i = 0; i < node->GetObjVector()->size(); i++)
	{
		if(node->GetObjVector()->at(i)->GetType()==OBJECT_ENTITY)
		{
			//TO DO:
			//Берем шейдер, соотвутствующий сущности и активируем его
			//-----
			CMaterial* mat;
			CShader* sh;
			if((mat = ((CEntity*)node->GetObjVector()->at(i))->GetMaterial())!=0)
			{
				if((sh = mat->GetShader())!=0)
				{
					if(sh->IsCompiled())
					{
						glUseProgram(sh->GetProgramId());
					}
				}
			}
			DrawMesh(((CEntity*)node->GetObjVector()->at(i))->GetMesh());
			glUseProgram(0);
		}
	}
	
	glDisable(GL_DEPTH_TEST);
	glBegin(GL_LINES);
	glColor3f(0.5, 1, 0.5);
	glVertex3f(0, 0, 0);
	glVertex3f(0, 1, 0);
	glColor3f(1, 0.5, 0.5);
	glVertex3f(0, 0, 0);
	glVertex3f(1, 0, 0);
	glColor3f(0.5, 0.5, 1);
	glVertex3f(0, 0, 0);
	glVertex3f(0, 0, 1);
	glColor3f(1,1,1);
	glEnd();
	glEnable(GL_DEPTH_TEST);

	for(int i = 0; i < vec->size(); i++)
	{
		ProcessNode(vec->at(i));	
	}
	glTranslatef(-node->GetPosX(), -node->GetPosY(), -node->GetPosZ());
}
Exemple #14
0
IShader* WINAPI QERApp_Try_Shader_ForName(const char* name)
{
	// look for the shader
	CShader* pShader = g_Shaders.Shader_ForName( name );
	if (!pShader)
		// not found
		return NULL;
	// we may need to load the texture or use the "shader without texture" one
	pShader->Activate();
  pShader->SetDisplayed( true );
	return pShader;
}
Exemple #15
0
// 深度优先递归遍历目录中所有的文件
BOOL  DirectoryList(LPCSTR Path, int nRenderType)
{
	WIN32_FIND_DATA FindData;
	HANDLE hError;
	int FileCount = 0;
	char FilePathName[LEN];
	// 构造路径
	char FullPathName[LEN];
	strcpy(FilePathName, Path);
	strcat(FilePathName, "\\*.*");
	hError = FindFirstFile(FilePathName, &FindData);
	if (hError == INVALID_HANDLE_VALUE)
	{
		return 0;
	}
	while(::FindNextFile(hError, &FindData))
	{
		// 过虑.和..
		if (strcmp(FindData.cFileName, ".") == 0 
			|| strcmp(FindData.cFileName, "..") == 0 )
		{
			continue;
		}

		// 构造完整路径
		wsprintf(FullPathName, "%s\\%s", Path,FindData.cFileName);
		FileCount++;
		// 输出本级的文件
		//printf("\n%d  %s  ", FileCount, FullPathName);
		char szName[255];
		strcpy(szName,FindData.cFileName);
		int nLen = strlen(szName);
		if (nLen>3 && strcmp(szName+nLen-3,".fx")==0)
		{
			szName[nLen-3]=0;
			CShader* pShader = CRenderSystem::getSingleton().registerShader(szName,FullPathName);
			if (pShader)
			{
				pShader->setRenderType(nRenderType);
			}
		}
// 		if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
// 		{
// 			printf("<Dir>");
// 			DirectoryList(FullPathName);
// 		}



	}
	return 0;
}
void CSDLOpenGLWindow::ReleaseScene()
{
	for (int i = 0; i < 4; i++)
		tTextures[i].DeleteTexture();

	spDirectionalLight.DeleteProgram();

	shFragment.DeleteShader();
	shVertex.DeleteShader();

	glDeleteVertexArrays(1, uiVAOs);
	vboSceneObjects.DeleteVBO();
}
Exemple #17
0
DLLEXPORT CShader* CRenderer::CreateShaderFromFile(char* path)
{
	CShader* shader = new CShader();
	Log("Creating shader from \""); Log(path); Log("\"\n");

	GLchar* text = new GLchar[256];
	strcpy(text, "void main(){ gl_FragColor = vec4(0.4,0.0,0.1,1.0); }");
	shader->WritePixelShader(strlen(text), text);
	delete text;

	queueShaders->push(shader);

	return shader;
}
void CSDLOpenGLWindow::ReleaseScene()
{
	spTextured.DeleteProgram();
	spColored.DeleteProgram();

	shFragmentTex.DeleteShader();
	shFragmentCol.DeleteShader();
	shVertexTex.DeleteShader();
	shVertexCol.DeleteShader();

	glDeleteVertexArrays(2, uiVAOs);
	vboSceneObjects.DeleteVBO();
	tBox.DeleteTexture();
	tBlueIce.DeleteTexture();
}
Exemple #19
0
/**********************
* void BasicAS::setGPUParameters( CShader& l_Shader )
*
* sets shader parameters for the BasicAS
***********************/
void BasicAS::setGPUParameters( CShader& l_Shader, GPUAccelerationStructureData& l_ASD )
{
#ifndef STUB
    CGparameter& cell_info = l_Shader.GetNamedParameter("cellData0", true);
    cgGLSetTextureParameter(cell_info, l_ASD.m_CellTexture[0]);

    CGparameter& v0 = l_Shader.GetNamedParameter("v0t", true);
    cgGLSetTextureParameter(v0, l_ASD.m_VertexTexture[0]);

    CGparameter& v1 = l_Shader.GetNamedParameter("v1t", true);
    cgGLSetTextureParameter(v1, l_ASD.m_VertexTexture[1]);

    CGparameter& v2 = l_Shader.GetNamedParameter("v2t", true);
    cgGLSetTextureParameter(v2, l_ASD.m_VertexTexture[2]);
#endif
}
Exemple #20
0
void RenderScene() 
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear The Screen And The Depth Buffer
	glLoadIdentity();									// Reset The matrix


/////// * /////////// * /////////// * NEW * /////// * /////////// * /////////// * ///////

	// In our RenderScene() function we will now start using the shader.  We added support
	// to create quadrics so we don't have to load any models, which makes the tutorials easy.
	// What we do is create a sphere and then have our shader make it wave.  When we loaded
	// the shader files it turned ON the shader, so we don't need to turn it on every frame.
	// Notice that we pass in our g_TimeLoc variable that we got in the Init() function above
	// to change the "time" variable in the vertex shader.  We also pass in a new waveChange
	// value to vary the wave.

	// Create a static float to hold our current wave value, then update and change it each frame.
	static float waveChange = 0.0f;
	g_Shader.SetFloat(g_TimeLoc, waveChange);
	waveChange += 0.06f;

	GLUquadricObj *pObj = gluNewQuadric();				// Get a Quadric off the stack

	gluQuadricDrawStyle(pObj, GLU_LINE);				// Draw the sphere in wireframe

	glTranslatef(0.0f, 0.0f, -6.5f);					// Move the sphere backwards from the camera
	gluSphere(pObj, 2.5f, 75, 75);						// Draw a decent poly sphere with a radius of 2.5
	
	gluDeleteQuadric(pObj);								// Free the Quadric

/////// * /////////// * /////////// * NEW * /////// * /////////// * /////////// * ///////


	SwapBuffers(g_hDC);									// Swap the backbuffers to the foreground
}
Exemple #21
0
CShader* CShaderArray::Shader_ForTextureName( const char * name) const
{
#ifdef _DEBUG
  // check we were given a texture name that fits the qtexture_t naming conventions
  if (strcmp( name, CleanTextureName( name ) ) != 0)
    Sys_Printf("WARNING: texture name %s doesn't fit qtexture_t conventions in CShaderArray::Shader_ForTextureName\n", name);
#endif
  int i;
  for ( i = 0; i < CPtrArray::GetSize(); i++ )
  {
    CShader *pShader = static_cast<CShader*>(CPtrArray::GetAt(i));
    if (strcmp( name, CleanTextureName( pShader->getTextureName() ) ) == 0)
      return pShader;
  }
  return NULL;
}
Exemple #22
0
	// -----------------------------------------------------
	void CGraphicsRenderer::RenderScene()
	{
		// render scene to diffuse RT
		CRenderer::cGraphicsDevice()->BeginRendering(1, m_mrt_diffuse);
		//CRenderer::cGraphicsDevice()->Clear(ColorRGB(0,1,1));

		for (unsigned int i=0; i<m_chunks.Size(); i++)
		{
			const GeometryChunk& chunk = m_chunks[i];

			CIndexBuffer* ib = CRenderer::cGraphicsManager()->GetCachedIndexBuffer(chunk.Data->ibId);
			CVertexBuffer* vb = CRenderer::cGraphicsManager()->GetCachedVertexBuffer(chunk.Data->vbId);

			ib->Use();
			vb->Use();

			// OPTIM: if we ensure valid pointer every time, remove this if-s
			if (chunk.Subset->materialPtr)
			{
				CShader *vs = (CShader*)chunk.Subset->materialPtr->vsPtr;
				CShader *ps = (CShader*)chunk.Subset->materialPtr->psPtr;

				if (ps) 
					ps->Use();

				if (vs)
				{
					vs->Use();
				}
			}


			vb->RenderIndexed(P3DPT_TRIANGLELIST, chunk.Subset->StartIndex, chunk.Subset->NumTriangles);
			
		}

		CRenderer::cGraphicsDevice()->EndRendering();

		// render diffuse RT on standard backbuffer
		CRenderer::cGraphicsDevice()->BeginRendering();
			
			CRenderer::cPrimitiveRenderer()->AddRectangleRel(Vec2(0.0f, 0.0f), Vec2(1.0f, -1.0f), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), m_mrt_diffuse);
			CRenderer::cPrimitiveRenderer()->Render();

		CRenderer::cGraphicsDevice()->EndRendering();
	}
Exemple #23
0
Void CWidgetCanvas::Render(CRenderer& renderer, CShader& shader)
{
	CGuiRenderPass& uiPass = *renderer.GetGuiRenderPass();

    if( m_NinePatch )
    {
        shader.GetParameter("UseTexture")->SetValue( (Bool) TRUE );
//        shader.GetParameter("Texture")->SetValue( *m_NinePatch );
    }
    else
    {
        shader.GetParameter("UseTexture")->SetValue( (Bool) FALSE );
    }

    const CColor& col = m_Color;
    uiPass.DrawQuad(shader, GetRect(), col);

    CWidget::Render(renderer, shader);
}
Exemple #24
0
	// -----------------------------------------------------
	void CGraphicsRenderer::RenderScene(sFrameBufferUnit *FBUnits, UINT numUnits)
	{
		if(FBUnits != NULL) 
		{
			//TODO: setup the appropriate render targets
			CRenderer::cGraphicsDevice()->BeginRendering(1, m_mrt_diffuse);
			//CRenderer::cGraphicsDevice()->Clear(ColorRGB(0,1,1));
		}
		else CRenderer::cGraphicsDevice()->BeginRendering(); //render to back buffer

		for (unsigned int i=0; i<m_chunks.Size(); i++)
		{
			const GeometryChunk& chunk = m_chunks[i];

			CIndexBuffer* ib = CRenderer::cGraphicsManager()->GetCachedIndexBuffer(chunk.Data->ibId);
			CVertexBuffer* vb = CRenderer::cGraphicsManager()->GetCachedVertexBuffer(chunk.Data->vbId);

			ib->Use();
			vb->Use();

			// OPTIM: if we ensure valid pointer every time, remove this if-s
			if (chunk.Subset->materialPtr)
			{
				CShader *vs = (CShader*)chunk.Subset->materialPtr->vsPtr;
				CShader *ps = (CShader*)chunk.Subset->materialPtr->psPtr;

				if (ps) 
					ps->Use();

				if (vs)
				{
					vs->Use();
				}
			}


			vb->RenderIndexed(P3DPT_TRIANGLELIST, chunk.Subset->StartIndex, chunk.Subset->NumTriangles);

		}

		CRenderer::cGraphicsDevice()->EndRendering();

	}
Void CScreenQuad::Render( CRenderer& renderer, const CVector2f& pos, const CVector2f& size, CShader& shader )
{
	DebugGraphicCommandGroup( "CScreenQuad::Render" );

	CShaderParameter* p;	
	p = shader.GetParameter( "Size" );
	if( p )
		p->SetValue( CShaderParameterData( size ) );
	
	p = shader.GetParameter( "Position" );
	if( p )
		p->SetValue( CShaderParameterData( pos ) );

	renderer.Activate( m_VertexBuffer, 0 );
	renderer.Activate( m_VertexLayout );
	renderer.Activate( m_IndexBuffer );
	renderer.Activate( shader );

	GraphicsManager.GetImpl().DrawIndexed( nPrimitiveType_TriangleList, 6, 0, 0 );

}
Exemple #26
0
IShader* WINAPI QERApp_Shader_ForName(const char* name)
{
	//++timo FIXME: do we allow NULL and "" calling?
	// how does it deal with notexture? can we simply replace by "textures/radiant/notex"?
	if (name == NULL || strlen(name) == 0)
	{
		Sys_Printf("FIXME: name == NULL || strlen(name) == 0 in QERApp_Shader_ForName\n");
		return QERApp_Shader_ForName("radiant/notex"); //++timo ???
	}

	// entities that should be represented with plain colors instead of textures
	// request a texture name with (r g b) (it's stored in their class_t)
	if (name[0]=='(')
	{
		return QERApp_ColorShader_ForName(name);
	}

	CShader* pShader = static_cast<CShader*>(QERApp_Try_Shader_ForName( name ));
	if (pShader)
	{
		pShader->SetDisplayed( true );
		return pShader;
	}
	// we don't know this shader, maybe it's a straight texture 
	pShader = new CShader;
	pShader->CreateDefault( name );
  // hook it into the shader list
	g_Shaders.Add( (LPVOID)pShader );
	pShader->IncRef();
	// if it can't find the texture, "textures/radiant/notex" will be used
  pShader->Activate();
  pShader->SetDisplayed( true );
	return pShader;
}
Exemple #27
0
bool CScene::ZPassRender()
{
	std::list<axelynx::Camera *>::const_iterator ci = camlist.begin();
	std::list<axelynx::Camera *>::const_iterator ei = camlist.end();

	CEarlyZ::StartEarlyZPass();
	for(;ci!=ei;++ci)
	{
		if((*ci)->isEnabled())
		{
			frame_++;
			(*ci)->Bind();
			CMaterial::Free(); //материал зависит от камеры
			OPENGL_CHECK_FOR_ERRORS();
			for(int i=0;i<256;++i)
			{
				if(visible_groups_[i])
					scenegraph_[i]->Render(*ci);
			}
						(*ci)->UnBind();
			CMaterial::Free(); //материал зависит от камеры
		}
	}

	CShader *cs = CShader::Current();

	if(cs)
		cs->UnBind();

	for(int i=0;i<16;++i)
	{
		CTexture *ct = CTexture::Current(i);
		if(ct)
			ct->UnBind();
	}
	CEarlyZ::EndEarlyZPass();

	zpassed = true;
	return true;
}
void CWin32Renderer::draw(CRenderable* pRenderable)
{
   if (pRenderable && pRenderable->canBeRendered())
   {
      const GLuint vboId = (GLuint)pRenderable->get1DParam(VBO0_ID);
      const GLuint iboId = (GLuint)pRenderable->get1DParam(IBO0_ID);
      if (vboId && iboId)
      {
         glBindBuffer(GL_ARRAY_BUFFER, vboId);
         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboId);

         ///@todo: implement in renderable, add the argument that defines the environment
         pRenderable->setEnvironment(); // Renderable-specific changes of the OpenGL environment: switch depth on/off etc.

         CGeometry* pGeometry = pRenderable->getGeometry();
         CShader* pShader = pRenderable->getShader();
         if (pGeometry && pShader)
         {
            pShader->setup(*pRenderable);
            if (mIsDebugMode && pRenderable->getFlag(eShaderFlags::DRAW_LINES))
            {
               glLineWidth(pRenderable->get1DParam(eShader1DParams::LINE_WIDTH));
               glDrawElements(GL_LINES, pGeometry->getNumOfIndices(), GL_UNSIGNED_INT, 0);
            }
            else
            {
               glDrawElements(GL_TRIANGLE_STRIP, pGeometry->getNumOfIndices(), GL_UNSIGNED_INT, 0);
            }
         }

         // Return to the initial OpenGL state.
         pRenderable->resetEnvironment();

         glBindBuffer(GL_ARRAY_BUFFER, 0);
         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
         glBindTexture(GL_TEXTURE_2D, 0);
      }
   }
}
Exemple #29
0
void Init(HWND hWnd)
{
	g_hWnd = hWnd;										// Assign the window handle to a global window handle
	GetClientRect(g_hWnd, &g_rRect);					// Assign the windows rectangle to a global RECT
	InitializeOpenGL(g_rRect.right, g_rRect.bottom);	// Init OpenGL with the global rect


/////// * /////////// * /////////// * NEW * /////// * /////////// * /////////// *

	// Let's init our GLSL functions and make sure this computer can run the program.
	InitGLSL();

	// Here we pass in our vertex and fragment shader files to our shader object.
	g_Shader.InitShaders("morph.vert", "morph.frag");

	// Now we want to get the variable "time" in the morph.vert file so we can update it.
	g_TimeLoc = g_Shader.GetVariable("time");

/////// * /////////// * /////////// * NEW * /////// * /////////// * /////////// *


}
Exemple #30
0
void CNormalGenerator::SetNormalTexture(size_t iMaterial)
{
	// Materials not loaded yet?
	if (iMaterial >= SMAKWindow()->GetMaterials().size())
		return;

	CMaterialHandle hMaterial = SMAKWindow()->GetMaterials()[iMaterial];

	CShader* pShader = CShaderLibrary::GetShader(hMaterial->m_sShader);
	size_t iDiffuse = pShader->FindTextureByUniform("iDiffuse");
	if (iDiffuse >= hMaterial->m_ahTextures.size())
		return;

	CTextureHandle hDiffuseTexture = hMaterial->m_ahTextures[iDiffuse];

	if (!hDiffuseTexture.IsValid())
		return;

	m_iMaterial = iMaterial;

	// Don't let the listeners know yet, we want to generate the new one first so there is no lapse in displaying.
//	m_bNewNormal2Available = true;

	m_avecTextureTexels.resize(hDiffuseTexture->m_iWidth*hDiffuseTexture->m_iHeight);

	CRenderer::ReadTextureFromGL(hDiffuseTexture, m_avecTextureTexels.data());

	m_iNormal2Width = hDiffuseTexture->m_iWidth;
	m_iNormal2Height = hDiffuseTexture->m_iHeight;

	m_aflLowPassTexels.resize(hDiffuseTexture->m_iWidth*hDiffuseTexture->m_iHeight);
	m_aflMidPassTexels.resize(hDiffuseTexture->m_iWidth*hDiffuseTexture->m_iHeight);
	m_avecNormal2Texels.resize(hDiffuseTexture->m_iWidth*hDiffuseTexture->m_iHeight);

	Setup();

	UpdateNormal2();
}