//============================================================================== VkPipelineColorBlendStateCreateInfo* PipelineImpl::initColorState( const ColorStateInfo& c, VkPipelineColorBlendStateCreateInfo& ci) { ci.logicOpEnable = VK_FALSE; ci.attachmentCount = c.m_attachmentCount; for(U i = 0; i < ci.attachmentCount; ++i) { VkPipelineColorBlendAttachmentState& out = const_cast<VkPipelineColorBlendAttachmentState&>( ci.pAttachments[i]); const ColorAttachmentStateInfo& in = c.m_attachments[i]; out.blendEnable = !(in.m_srcBlendMethod == BlendMethod::ONE && in.m_dstBlendMethod == BlendMethod::ZERO); out.srcColorBlendFactor = convertBlendMethod(in.m_srcBlendMethod); out.dstColorBlendFactor = convertBlendMethod(in.m_dstBlendMethod); out.colorBlendOp = convertBlendFunc(in.m_blendFunction); out.srcAlphaBlendFactor = out.srcColorBlendFactor; out.dstAlphaBlendFactor = out.dstColorBlendFactor; out.alphaBlendOp = out.colorBlendOp; out.colorWriteMask = convertColorWriteMask(in.m_channelWriteMask); } return &ci; }
//----------------------------------------------------------------------- void Quake3ShaderManager::parseShaderPassAttrib( const String& line, Quake3Shader* pShader, Quake3Shader::Pass* pPass) { StringVector vecparams; vecparams = StringUtil::split(line, " \t"); StringVector::iterator params = vecparams.begin(); StringUtil::toLowerCase(params[0]); if (params[0] != "map" && params[0] != "clampmap" && params[0] != "animmap") { // lower case all except textures for (size_t i = 1; i < vecparams.size(); ++i) StringUtil::toLowerCase(params[i]); } // MAP if (params[0] == "map") { pPass->textureName = params[1]; StringUtil::toLowerCase(params[1]); if (params[1] == "$lightmap") pPass->texGen = TEXGEN_LIGHTMAP; } // CLAMPMAP if (params[0] == "clampmap") { pPass->textureName = params[1]; StringUtil::toLowerCase(params[1]); if (params[1] == "$lightmap") pPass->texGen = TEXGEN_LIGHTMAP; pPass->addressMode = TextureUnitState::TAM_CLAMP; } // ANIMMAP else if (params[0] == "animmap") { pPass->animFps = atof(params[1].c_str()); pPass->animNumFrames = static_cast<unsigned int>( vecparams.size() - 2 ); for (unsigned int frame = 0; frame < pPass->animNumFrames; ++frame) { pPass->frames[frame] = params[frame+2]; } } // BLENDFUNC else if (params[0] == "blendfunc") { if (params[1] == "add" || params[1] == "gl_add") { pPass->blend = LBO_ADD; pPass->blendDest = SBF_ONE; pPass->blendSrc = SBF_ONE; } else if (params[1] == "filter" || params[1] == "gl_filter") { pPass->blend = LBO_MODULATE; pPass->blendDest = SBF_ZERO; pPass->blendSrc = SBF_DEST_COLOUR; } else if (params[1] == "blend" || params[1] == "gl_blend") { pPass->blend = LBO_ALPHA_BLEND; pPass->blendDest = SBF_ONE_MINUS_SOURCE_ALPHA; pPass->blendSrc = SBF_SOURCE_ALPHA; } else { // Manual blend pPass->blendSrc = convertBlendFunc(params[1]); pPass->blendDest = convertBlendFunc(params[2]); // Detect common blends if (pPass->blendSrc == SBF_ONE && pPass->blendDest == SBF_ZERO) pPass->blend = LBO_REPLACE; else if (pPass->blendSrc == SBF_ONE && pPass->blendDest == SBF_ONE) pPass->blend = LBO_ADD; else if ((pPass->blendSrc == SBF_ZERO && pPass->blendDest == SBF_SOURCE_COLOUR) || (pPass->blendSrc == SBF_DEST_COLOUR && pPass->blendDest == SBF_ZERO)) pPass->blend = LBO_MODULATE; else if (pPass->blendSrc == SBF_SOURCE_ALPHA && pPass->blendDest == SBF_ONE_MINUS_SOURCE_ALPHA) pPass->blend = LBO_ALPHA_BLEND; else pPass->customBlend = true; // NB other custom blends might not work due to OGRE trying to use multitexture over multipass } } // RGBGEN else if (params[0] == "rgbgen") { // TODO } // ALPHAGEN else if (params[0] == "alphagen") { // TODO } // TCGEN else if (params[0] == "tcgen") { if (params[1] == "base") { pPass->texGen = TEXGEN_BASE; } else if (params[1] == "lightmap") { pPass->texGen = TEXGEN_LIGHTMAP; } else if (params[1] == "environment") { pPass->texGen = TEXGEN_ENVIRONMENT; } } // TCMOD else if (params[0] == "tcmod") { if (params[1] == "rotate") { pPass->tcModRotate = -atof(params[2].c_str()) / 360; // +ve is clockwise degrees in Q3 shader, anticlockwise complete rotations in Ogre } else if (params[1] == "scroll") { pPass->tcModScroll[0] = atof(params[2].c_str()); pPass->tcModScroll[1] = atof(params[3].c_str()); } else if (params[1] == "scale") { pPass->tcModScale[0] = atof(params[2].c_str()); pPass->tcModScale[1] = atof(params[3].c_str()); } else if (params[1] == "stretch") { if (params[2] == "sin") pPass->tcModStretchWave = SHADER_FUNC_SIN; else if (params[2] == "triangle") pPass->tcModStretchWave = SHADER_FUNC_TRIANGLE; else if (params[2] == "square") pPass->tcModStretchWave = SHADER_FUNC_SQUARE; else if (params[2] == "sawtooth") pPass->tcModStretchWave = SHADER_FUNC_SAWTOOTH; else if (params[2] == "inversesawtooth") pPass->tcModStretchWave = SHADER_FUNC_INVERSESAWTOOTH; pPass->tcModStretchParams[0] = atof(params[3].c_str()); pPass->tcModStretchParams[1] = atof(params[4].c_str()); pPass->tcModStretchParams[2] = atof(params[5].c_str()); pPass->tcModStretchParams[3] = atof(params[6].c_str()); } } // TURB else if (params[0] == "turb") { pPass->tcModTurbOn = true; pPass->tcModTurb[0] = atof(params[2].c_str()); pPass->tcModTurb[1] = atof(params[3].c_str()); pPass->tcModTurb[2] = atof(params[4].c_str()); pPass->tcModTurb[3] = atof(params[5].c_str()); } // DEPTHFUNC else if (params[0] == "depthfunc") { // TODO } // DEPTHWRITE else if (params[0] == "depthwrite") { // TODO } // ALPHAFUNC else if (params[0] == "alphafunc") { if (params[1] == "gt0") { pPass->alphaVal = 0; pPass->alphaFunc = CMPF_GREATER; } else if (params[1] == "ge128") { pPass->alphaVal = 128; pPass->alphaFunc = CMPF_GREATER_EQUAL; } else if (params[1] == "lt128") { pPass->alphaVal = 128; pPass->alphaFunc = CMPF_LESS; } } }