void LWPRender::QuietlyGetTransients() { // get transients and don't complain if any failed (for layout-modeler plugins) backdropInfo = (LWBackdropInfo *)globalFunc(LWBACKDROPINFO_GLOBAL, GFUSE_TRANSIENT); compInfo = (LWCompInfo *)globalFunc(LWCOMPINFO_GLOBAL, GFUSE_TRANSIENT); fogInfo = (LWFogInfo *)globalFunc(LWFOGINFO_GLOBAL, GFUSE_TRANSIENT); sceneInfo = (LWSceneInfo *)globalFunc(LWSCENEINFO_GLOBAL, GFUSE_TRANSIENT); timeInfo = (LWTimeInfo *)globalFunc(LWTIMEINFO_GLOBAL, GFUSE_TRANSIENT); if (!systemIsScreamerNet) interfaceInfo = (LWInterfaceInfo *)globalFunc(LWINTERFACEINFO_GLOBAL, GFUSE_TRANSIENT); #ifdef LW6 // read light positions [NOTE] to work around wPosition bug in LW LightPosQ.clear(); for (LWPLight l = LWPLight::first(); l; l = l.next()) { Point v; l.param(LWIP_W_POSITION, timeInfo->time, v); LightPosQ << LightPos(l, v); } #endif }
XCALL_(LWError) LWPRender::NewTime(void * inst, LWFrame f, LWTime t) { // get transients each NewTime if (!(backdropInfo = (LWBackdropInfo *)globalFunc(LWBACKDROPINFO_GLOBAL, GFUSE_TRANSIENT))) return "Couldn't get Backdrop Info"; if (!(compInfo = (LWCompInfo *)globalFunc(LWCOMPINFO_GLOBAL, GFUSE_TRANSIENT))) return "Couldn't get Compositing Info"; if (!(fogInfo = (LWFogInfo *)globalFunc(LWFOGINFO_GLOBAL, GFUSE_TRANSIENT))) return "Couldn't get Fog Info"; if (!(sceneInfo = (LWSceneInfo *)globalFunc(LWSCENEINFO_GLOBAL, GFUSE_TRANSIENT))) return "Couldn't get Scene Info"; if (!(timeInfo = (LWTimeInfo *)globalFunc(LWTIMEINFO_GLOBAL, GFUSE_TRANSIENT))) return "Couldn't get Time Info"; if (!systemIsScreamerNet) { if (!(interfaceInfo = (LWInterfaceInfo *)globalFunc(LWINTERFACEINFO_GLOBAL, GFUSE_TRANSIENT))) return "Couldn't get Interface Info"; } #ifdef LW6 // read light positions [NOTE] to work around wPosition bug in LW LightPosQ.clear(); for (LWPLight l = LWPLight::first(); l; l = l.next()) { Point v; l.param(LWIP_W_POSITION, t, v); LightPosQ << LightPos(l, v); } #endif // get world to screen matrix TransW2S = LWPCamera::renderCamera().w2sMatrix(t); return ((LWPRender *)inst)->newTime(f, t); }
int main(int argc, char *argv[]) { GLFWwindow* window; glfwSetErrorCallback(error_callback); if (!glfwInit()) exit(EXIT_FAILURE); // OpenGL 3.3, Mac OS X is reported to have some problem. However I don't have Mac to test glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // For Mac OS X glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); int width = 1366; int height = 768; window = glfwCreateWindow(width, height, "Simple Example", NULL, NULL); if (!window) { glfwTerminate(); return EXIT_FAILURE; } glfwMakeContextCurrent(window); // This line MUST put below glfwMakeContextCurrent glewExperimental = GL_TRUE; glewInit(); // Enable vsync glfwSwapInterval(1); // Setup input callback glfwSetKeyCallback(window, key_callback); glProvokingVertex(GL_FIRST_VERTEX_CONVENTION); // load shader program - default is flat loadShader("Shader/flat_vertexShader.vs","Shader/flat_fragmentShader.frag"); // Enable blend mode for billboard //glEnable(GL_BLEND); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); float last, start; last = start = glfwGetTime(); int fps=0; //objects[sun].model = glm::scale(glm::mat4(1.0f), glm::vec3(0.85f)); std::cout<<"You can press the Key 1~4 to control the shader mode!"<<std::endl; std::cout<<"1 for flat"<<std::endl; std::cout<<"2 for Gouraud"<<std::endl; std::cout<<"3 for Phong"<<std::endl; std::cout<<"4 for Blinn-Phong"<<std::endl; while (!glfwWindowShouldClose(window)) {//program will keep draw here until you close the window float delta = glfwGetTime() - start; // Require for the rotation of sun render(); glfwSwapBuffers(window); glfwPollEvents(); fps++; glm::vec3 camera = glm::vec3( 30.0f , 30.0f , 30.0f); // set matrix //glm::mat4 proj = glm::perspective(glm::radians(20.0f), 640.0f / 480, 1.0f, 100.f)*glm::lookAt(glm::vec3(25.0f), glm::vec3(), glm::vec3(0, 1, 0)) * glm::mat4(1.0f); glm::mat4 proj = glm::perspective(glm::radians(20.0f), 640.0f / 480, 1.0f, 100.f); glm::mat4 view = glm::mat4(1.0f)*glm::lookAt(camera, glm::vec3(), glm::vec3(0, 1, 0)) * glm::mat4(1.0f); glm::mat4 model = glm::scale(glm::mat4(1.0f), glm::vec3(0.85f))*glm::rotate(glm::mat4(), (GLfloat)glfwGetTime() * 0.1f, glm::vec3(0.0f, 1.0f, 0.0f)); // Light Position glm::vec3 LightPos(5.0f,15.0f,5.0f); setColorAttr(program , LightPos , camera); // Set program setVS(program,proj,view,model); if(glfwGetTime() - last > 1.0) { // Every second // std::cout<<(double)fps/(glfwGetTime()-last)<<std::endl; fps = 0; last = glfwGetTime(); } } releaseObjects(); glfwDestroyWindow(window); glfwTerminate(); return EXIT_SUCCESS; }
void D3DRenderPipeline::Render( void ) { auto itMatGroup = m_renderGroup.begin(); while( itMatGroup != m_renderGroup.end() ) { MaterialGroup& matGroup = itMatGroup->second; Resource::Material* pMat = matGroup.m_pMaterial; if( NULL == pMat ) { if( NULL == m_pEffect ) { ++itMatGroup; continue; } Resource::Material* pTerrainMat = Resource::MaterialManager::GetInstance()->CreateOrRetrieveMaterial("TerrainMat"); Resource::Texture2D* pTerrainColorTex = pTerrainMat->GetTexture(DIFFUSE_CH); //渲染地形 m_pEffect->SetTechnique( "TerrainShading" ); Math::Vec3 LightPos( 2000.0f , 8000.0f , 3000.f ); Math::Vec3 DirLightDir( 0.5f , -1.0f , 0.5f ); DirLightDir.Normalize(); m_pEffect->SetValue( "f3LightPos" , &(LightPos) , sizeof(LightPos) ); m_pEffect->SetValue( "f3DirLightDir" , &DirLightDir , sizeof(DirLightDir) ); D3DMATERIAL9 material; Math::Vec4 v4Ambient( 0.1f , 0.1f, 0.1f , 1.0f ); Math::Vec4 v4Diffuse( 1.0f , 1.0f , 1.0f , 1.0f ); Math::Vec4 v4Specular( 1.0f , 1.0f , 1.0f , 1.0f ); float fShininess = 128.0f; //应用材质 memset( &material , 0 , sizeof( material ) ); memcpy( &material.Ambient , &v4Ambient , sizeof(D3DCOLORVALUE) ); memcpy( &material.Diffuse , &v4Diffuse , sizeof(D3DCOLORVALUE) ); memcpy( &material.Specular , &v4Specular , sizeof(D3DCOLORVALUE) ); material.Power = fShininess; int size = sizeof(material); m_pEffect->SetValue( "g_Material" , (LPCVOID)&material , sizeof(material) ); float fTerrainHeightRange = ( Terrain::ClipMapReader::GetInstance()->GetHeightMapMaxHeight() - Terrain::ClipMapReader::GetInstance()->GetHeightMapMinHeight() ) * CLIPMAP_HEIGHT_SCALE ; m_pEffect->SetFloat("fTerrainHeightRange" , fTerrainHeightRange ); if( pTerrainColorTex ) { m_pEffect->SetTexture("terrainColorTex" , (IDirect3DTexture9*)pTerrainColorTex->GetUserPointer()); } UINT uiPassCount = 0; m_pEffect->Begin( &uiPassCount , 0 ); for( UINT uiPass = 0 ; uiPass < uiPassCount ; uiPass++ ) { m_pEffect->BeginPass( uiPass ); auto itOp = matGroup.m_OpList.begin(); while( itOp != matGroup.m_OpList.end() ) { D3DRenderOperation* pOp = *itOp; m_pEffect->SetMatrix( "m4World" , (D3DXMATRIX*)&( pOp->m_worldMat ) ); m_pEffect->CommitChanges(); m_pDevice->SetVertexDeclaration( pOp->m_pVertexDecl ); m_pDevice->SetStreamSource( pOp->m_streamIndex , pOp->m_pVB , 0 , pOp->m_stride ); m_pDevice->SetIndices( pOp->m_pIB ); m_pDevice->DrawIndexedPrimitive( pOp->m_primitiveType , 0 , 0 , pOp->m_vertexCount , 0 , pOp->m_primCount ); ++itOp; } m_pEffect->EndPass(); } m_pEffect->End(); ++itMatGroup; continue; } Resource::Texture2D* pDiffTex = pMat->GetTexture( DIFFUSE_CH ); Resource::Texture2D* pNormTex = pMat->GetTexture( BUMPMAP_CH ); String techniqueName = "NormalMapShading"; if( m_pEffect ) { UINT uiPassCount = 0; HRESULT hRes = m_pEffect->SetTechnique( techniqueName.c_str() ); Math::Vec3 LightPos( 30.f , 30.f , 30.f ); m_pEffect->SetValue( "f3LightPos" , &(LightPos) , sizeof(LightPos) ); D3DMATERIAL9 material; //应用材质 memset( &material , 0 , sizeof( material ) ); memcpy( &material.Ambient , &pMat->GetAmbient() , sizeof(D3DCOLORVALUE) ); memcpy( &material.Diffuse , &pMat->GetDiffuse() , sizeof(D3DCOLORVALUE) ); memcpy( &material.Specular , &pMat->GetSpecular() , sizeof(D3DCOLORVALUE) ); material.Power = pMat->GetShininess(); int size = sizeof(material); m_pEffect->SetValue( "g_Material" , (LPCVOID)&material , sizeof(material) ); if( pDiffTex ) { m_pEffect->SetTexture( "diffuseTex" , (IDirect3DTexture9*)pDiffTex->GetUserPointer() ); } if( pNormTex ) { m_pEffect->SetTexture( "normalTex" , (IDirect3DTexture9*)pNormTex->GetUserPointer() ); } m_pEffect->Begin( &uiPassCount , 0 ); for( UINT uiPass = 0 ; uiPass < uiPassCount ; uiPass++ ) { m_pEffect->BeginPass( uiPass ); auto itOp = matGroup.m_OpList.begin(); while( itOp != matGroup.m_OpList.end() ) { D3DRenderOperation* pOp = *itOp; m_pEffect->SetMatrix( "m4World" , (D3DXMATRIX*)&( pOp->m_worldMat ) ); m_pEffect->CommitChanges(); m_pDevice->SetVertexDeclaration( pOp->m_pVertexDecl ); m_pDevice->SetStreamSource( pOp->m_streamIndex , pOp->m_pVB , 0 , pOp->m_stride ); m_pDevice->SetIndices( pOp->m_pIB ); m_pDevice->DrawIndexedPrimitive( pOp->m_primitiveType , 0 , 0 , pOp->m_vertexCount, 0 , pOp->m_primCount ); ++itOp; } m_pEffect->EndPass(); } m_pEffect->End(); }//if( m_pEffect ) ++itMatGroup; } }