⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps1.0_program.cpp

📁 赫赫大名的 OGRE 游戏引擎
💻 CPP
📖 第 1 页 / 共 3 页
字号:

				if(cd.reg != "c0" || instr[3] != "c0")
					return;
				GLfloat eye[4];
				eye[0] = cd.r;
				eye[1] = cd.g;
				eye[2] = cd.b;
				eye[3] = cd.a;

				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV);
				glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_CONST_EYE_NV, eye);

				if(instr[2].find("_bx2") != string::npos)
				{
				   instr[2].erase(instr[2].begin() + instr[2].find("_bx2"), instr[2].end());
				   glTexEnvi(GL_TEXTURE_SHADER_NV, GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV, GL_EXPAND_NORMAL_NV);
				}
				if(reg2stage.count(instr[2]) == 0)
					fprintf(stderr,"incorrect \"texm3x3tex\" instruction, stage %d...\n", stage);
				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + reg2stage[instr[2]]);
			}
			else if(op == "texm3x3vspec")
			{
				if(instr.size() != 3 || stage == 0)
					fprintf(stderr,"incorrect \"texm3x3vspec\" instruction, stage %d...\n", stage);
				reg2stage[instr[1]] = stage;

				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV);

				if(instr[2].find("_bx2") != string::npos)
				{
				   instr[2].erase(instr[2].begin() + instr[2].find("_bx2"), instr[2].end());
				   glTexEnvi(GL_TEXTURE_SHADER_NV, GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV, GL_EXPAND_NORMAL_NV);
				}
				if(reg2stage.count(instr[2]) == 0)
					fprintf(stderr,"incorrect \"texm3x3tex\" instruction, stage %d...\n", stage);
				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + reg2stage[instr[2]]);
			}
			else if(op == "texreg2ar")
			{
				if(instr.size() != 3 || stage == 0)
					fprintf(stderr,"incorrect \"texreg2ar\" instruction, stage %d...\n", stage);
				reg2stage[instr[1]] = stage;
				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_DEPENDENT_AR_TEXTURE_2D_NV);
				if(reg2stage.count(instr[2]) == 0)
					fprintf(stderr,"incorrect \"texreg2ar\" instruction, stage %d...\n", stage);
				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + reg2stage[instr[2]]);
			}
			else if(op == "texreg2gb")
			{
				if(instr.size() != 3 || stage == 0)
					fprintf(stderr,"incorrect \"texreg2gb\" instruction, stage %d...\n", stage);
				reg2stage[instr[1]] = stage;
				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_DEPENDENT_GB_TEXTURE_2D_NV);
				if(reg2stage.count(instr[2]) == 0)
					fprintf(stderr,"incorrect \"texreg2gb\" instruction, stage %d...\n", stage);
				glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + reg2stage[instr[2]]);
			}
			stage++;
		}

		map<string, int> reg2stage;
		int stage;
		vector<constdef> * c;
	};
	
	GLenum reg_enum(string s, int stage)
	{
		/*if(s == "c0")
			return GL_CONSTANT_COLOR0_NV;
		else if(s == "c1")
			return GL_CONSTANT_COLOR1_NV;
		else if(s == "c2")
			return GL_CONSTANT_COLOR0_NV;
		else if(s == "c3")
			return GL_CONSTANT_COLOR1_NV;
		else if(s == "c4")
			return GL_CONSTANT_COLOR0_NV;
		else if(s == "c5")
			return GL_CONSTANT_COLOR1_NV;
		else if(s == "c6")
			return GL_CONSTANT_COLOR0_NV;
		else if(s == "c7")
			return GL_CONSTANT_COLOR1_NV;
			*/
		if (s == "c0" || s == "c1" || s == "c2" || s == "c3" || 
			s == "c4" || s == "c5" || s == "c6" || s == "c7")
		{
			GLenum result;
			if (!AddToMap(s,stage,result))
				errors.set("Illegal constant usage.",line_number);
			  // This is a pain, since the caller is a void and no check is made for errors. Sigh.
			return result;
		}
		else if(s == "t0")
			return GL_TEXTURE0_ARB;
		else if(s == "t1")
			return GL_TEXTURE1_ARB;
		else if(s == "t2")
			return GL_TEXTURE2_ARB;
		else if(s == "t3")
			return GL_TEXTURE3_ARB;
		else if(s == "v0")
			return GL_PRIMARY_COLOR_NV;
		else if(s == "v1")
			return GL_SECONDARY_COLOR_NV;
		else if(s == "r0")
			return GL_SPARE0_NV;
		else if(s == "r1")
			return GL_SPARE1_NV;
		else // ??
			return GL_DISCARD_NV;
	}

	struct src
	{
		src(string s, int stage, string *regname=NULL)
		{
			init(s, stage, regname);
		}


		void init(string s, int stage, string *regname=NULL)
		{
			arg = s;
			comp = GL_RGB;
            alphaComp = GL_ALPHA;
			map = GL_SIGNED_IDENTITY_NV;

			unsigned int offset;
			if(
                (offset = s.find(".a")) != string::npos ||
                (offset = s.find(".w")) != string::npos
              )
			{
				comp = GL_ALPHA;
				s.erase(offset, offset+2);
			}
            else if ((offset = s.find(".b")) != string::npos ||
                     (offset = s.find(".z")) != string::npos)
            {
                alphaComp = GL_BLUE;
                s.erase(offset,offset+2);
            }

			bool negate = false;

			if(s[0] == '1')
			{
				s.erase(0, 1);
				while(s[0] == ' ')
					s.erase(0,1);
				if(s[0] == '-')
					s.erase(0,1);
				while(s[0] == ' ')
					s.erase(0,1);
				map = GL_UNSIGNED_INVERT_NV;
			}
			else if(s[0] == '-')
			{
				s.erase(0, 1);
				while(s[0] == ' ')
					s.erase(0,1);
				negate = true;
				map = GL_UNSIGNED_INVERT_NV;
			}

			bool half_bias = false;
			bool expand = false;
			if(s.find("_bias") != string::npos)
			{
				s.erase(s.find("_bias"), 5);
				half_bias = true;
			}
			else if(s.find("_bx2") != string::npos)
			{
				s.erase(s.find("_bx2"), 4);
				expand = true;
			}
			
			if(expand)
			{
				if(negate)
					map = GL_EXPAND_NEGATE_NV;
				else
					map = GL_EXPAND_NORMAL_NV;
			}
			else if(half_bias)
			{
				if(negate)
					map = GL_HALF_BIAS_NEGATE_NV;
				else
					map = GL_HALF_BIAS_NORMAL_NV;
			}
			reg = reg_enum(s,stage);

			if (regname != NULL) 
				*regname = s; // return the bare register name

			
            //alphaComp = GL_ALPHA;
			std::set<const char*, ltstr>::iterator iter = 
				ps10::alphaBlueRegisters.find(s.c_str());
			if (iter != ps10::alphaBlueRegisters.end())
				alphaComp = GL_BLUE;

		}

		string arg;
		GLenum reg;
		GLenum map;
		GLenum comp;
		GLenum alphaComp;
	};


	struct set_register_combiners
	{
		set_register_combiners()
		{
          // combiner = 0;
          combiner = -1;
		}

		void operator() (vector<string> & instr)
		{
			string op;
			GLenum scale = GL_NONE;
			bool op_sat = false;
            bool paired_instr = false;
            int instr_base = 0;
            if (instr[0]=="+") {
              paired_instr = true;
              instr_base = 1;
            }
			op = instr[instr_base];
			unsigned int offset;
			if((offset = op.find("_x2")) != string::npos)
			{
				scale = GL_SCALE_BY_TWO_NV;
				op.erase(op.begin()+offset, op.begin()+offset+3);
			}
			else if((offset = op.find("_x4")) != string::npos)
			{
				scale = GL_SCALE_BY_FOUR_NV;
				op.erase(op.begin()+offset, op.begin()+offset+3);
			}
			else if((offset = op.find("_d2")) != string::npos)
			{
				scale = GL_SCALE_BY_ONE_HALF_NV;
				op.erase(op.begin()+offset, op.begin()+offset+3);
			}

			if((offset = op.find("_sat")) != string::npos)
			{
				// need to actually use this...
				op_sat = true;
				op.erase(op.begin()+offset, op.begin()+offset+4);
			}
			
			string dst = instr[1+instr_base];
			int mask = GL_RGBA;
			if(
                (offset = dst.find(".rgba")) != string::npos  ||
                (offset = dst.find(".xyzw")) != string::npos 
                )
			{
				dst.erase(offset, offset + 5);
			}
			else if(
                (offset = dst.find(".rgb")) != string::npos  ||
                (offset = dst.find(".xyz")) != string::npos 
                )
			{
				dst.erase(offset, offset + 4);
				mask = GL_RGB;
			}
			else if(
                (offset = dst.find(".a")) != string::npos  ||
                (offset = dst.find(".w")) != string::npos 
                )
			{
				dst.erase(offset, offset + 2);
				mask = GL_ALPHA;
			}

            if (!paired_instr) 
              combiner++;

			GLenum dreg = reg_enum(dst,combiner);
			GLenum C = GL_COMBINER0_NV + combiner;

			bool isAlphaBlue = false; // To keep track of whether the dst register's alpha was its blue value.

			if(op == "add" || op == "sub")
			{
				src a(instr[2+instr_base],combiner);
				src b(instr[3+instr_base],combiner);

				if(mask == GL_RGBA || mask == GL_RGB)
				{
					glCombinerInputNV_ptr(C, GL_RGB, GL_VARIABLE_A_NV, a.reg, a.map, a.comp);
					glCombinerInputNV_ptr(C, GL_RGB, GL_VARIABLE_B_NV, GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB);
					glCombinerInputNV_ptr(C, GL_RGB, GL_VARIABLE_C_NV, b.reg, b.map, b.comp);
					if(op == "add")
						glCombinerInputNV_ptr(C, GL_RGB, GL_VARIABLE_D_NV, GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB);
					else
						glCombinerInputNV_ptr(C, GL_RGB, GL_VARIABLE_D_NV, GL_ZERO, GL_EXPAND_NORMAL_NV, GL_RGB);
					glCombinerOutputNV_ptr(C, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, dreg, scale, GL_NONE,
									   GL_FALSE, GL_FALSE, GL_FALSE);
				}
				else if (!paired_instr)
				{
					glCombinerOutputNV_ptr(C, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_DISCARD_NV, GL_NONE, GL_NONE,
									   GL_FALSE, GL_FALSE, GL_FALSE);
				}

				if(mask == GL_RGBA || mask == GL_ALPHA)
				{
					glCombinerInputNV_ptr(C, GL_ALPHA, GL_VARIABLE_A_NV, a.reg, a.map, a.alphaComp);
					glCombinerInputNV_ptr(C, GL_ALPHA, GL_VARIABLE_B_NV, GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
					glCombinerInputNV_ptr(C, GL_ALPHA, GL_VARIABLE_C_NV, b.reg, b.map, b.alphaComp);
					if(op == "add")
						glCombinerInputNV_ptr(C, GL_ALPHA, GL_VARIABLE_D_NV, GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
					else
						glCombinerInputNV_ptr(C, GL_ALPHA, GL_VARIABLE_D_NV, GL_ZERO, GL_EXPAND_NORMAL_NV, GL_ALPHA);
					glCombinerOutputNV_ptr(C, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, dreg, scale, GL_NONE,
									   GL_FALSE, GL_FALSE, GL_FALSE);
				}
				else if (!paired_instr)
				{
					glCombinerOutputNV_ptr(C, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_DISCARD_NV, GL_NONE, GL_NONE,
									   GL_FALSE, GL_FALSE, GL_FALSE);
				}
			}
			else if(op == "cnd")
			{
				src a(instr[3+instr_base],combiner);
				src b(instr[4+instr_base],combiner);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -