public void addDecal(Vector3 origin, int nro_face, string model, bool sangre) { // verifico si esta suficientemente alejado del anterior, para evitar // una secuencia de tiros muy cerca if (cant_decals > 0 && (origin - decals[cant_decals - 1].origin).LengthSquared() < 50) { return; } Vector3 [] face_v = g_faces[nro_face].v; Vector3 n = Vector3.Cross(face_v[2] - face_v[0], face_v[1] - face_v[0]); n.Normalize(); Vector3 up; if (MathF.Abs(n.X) <= MathF.Abs(n.Y) && MathF.Abs(n.X) <= MathF.Abs(n.Z)) { up = new Vector3(1, 0, 0); } else if (MathF.Abs(n.Y) <= MathF.Abs(n.X) && MathF.Abs(n.Y) <= MathF.Abs(n.Z)) { up = new Vector3(0, 1, 0); } else { up = new Vector3(0, 0, 1); } Vector3 v = Vector3.Cross(n, up); v.Normalize(); Vector3 u = Vector3.Cross(n, v); u.Normalize(); float du = sangre ? 25 : 5; float dv = sangre ? 25 : 5; float dn = g_faces[nro_face].nro_modelo > 0 ? 0.5f : -5f; Vector3 p = origin - u * du * 0.5f - v * dv * 0.5f + n * dn; VertexPositionTexture[] vertices = new VertexPositionTexture[4]; vertices[0] = new VertexPositionTexture(p, new Vector2(0, 0)); vertices[1] = new VertexPositionTexture(p + u * du, new Vector2(0, 1)); vertices[2] = new VertexPositionTexture(p + v * dv, new Vector2(-1, 0)); vertices[3] = new VertexPositionTexture(p + u * du + v * dv, new Vector2(-1, 1)); decalsVertexBuffer.SetData(cant_decals * 4 * 20, vertices, 0, 4, 20); decals[cant_decals++] = new info_decal(this, origin, model, device, sangre); }
public void cargarEntidades(string fname) { string lumpname = map_folder + fname + ".ent"; if (!File.Exists(lumpname)) { return; } StreamReader reader; int state = 0; string key = "", value = ""; Vector3 origin = new Vector3(0, 0, 0); Vector3 angles = new Vector3(0, 0, 0); Vector3 rendercolor = new Vector3(1, 1, 1); float renderamt = 1; float scale = 0; string model = "", classname = ""; reader = new StreamReader(lumpname); do { char ch = (char)reader.Read(); switch (ch) { case '{': state = 1; break; case '"': switch (state) { case 1: case 5: key = ""; state = 2; // input key break; case 2: state = 3; break; case 3: state = 4; value = ""; // input value break; case 4: state = 5; // fin de entrada key , value if (key == "origin") { origin = parseVector3(value); } else if (key == "model" || key == "RopeMaterial" || key == "texture") { model = value; } else if (key == "classname") { classname = value; } else if (key == "angles") { angles = parseOrient(value); } else if (key == "scale") { scale = float.Parse(value, CultureInfo.InvariantCulture.NumberFormat); } else if (key == "rendercolor") { rendercolor = parseColor(value); } else if (key == "renderamt") { renderamt = float.Parse(value, CultureInfo.InvariantCulture.NumberFormat) / 255.0f; } break; } break; case '}': state = 0; // fin de entidad if (model.Contains(".mdl") && cant_modelos < MAX_MODELOS - 1) { model = model.Replace("models/", "").Replace(".mdl", ""); var p = modelos[cant_modelos++] = new bsp_model(); p.origin = origin; p.angles = angles; p.nro_mesh = mesh_pool.insert(model, device, Content, cs_folder); if (classname == "prop_door_rotating") { // caso particular: es una puerta que gira p.flags |= PROP_DOOR_ROTATING; } Debug.WriteLine(model + " " + origin + " " + angles); } else if ((classname == "env_sprite" || classname == "xkeyframe_rope") && cant_sprites < MAX_SPRITES - 1) { if (classname == "keyframe_rope") { rendercolor = new Vector3(1, 1, 1); renderamt = 1; } if (classname == "infodecal") { rendercolor = new Vector3(1, 1, 1); renderamt = 1; } model = model.Replace("materials/", "").Replace(".vmt", ""); var p = sprites[cant_sprites++] = new CSprite(model, device, Content); p.origin = origin; //p.scale = scale; p.renderamt = renderamt; p.rendercolor = rendercolor; Debug.WriteLine(model + " " + origin + " " + angles); } else if (classname == "infodecal" && cant_decals < MAX_DECALS - 1) { model = model.Replace("materials/", "").Replace(".vmt", ""); decals[cant_decals++] = new info_decal(this, origin, model, device); } else if (classname == "info_player_start") { info_player_start_pos = origin; info_player_start_angles = angles; } else if (classname == "hostage_entity") { var h = hostages[cant_hostages++] = new info_hostage(); h.origin = origin; h.angles = angles; } break; default: switch (state) { case 2: key += ch; break; case 4: value += ch; break; } break; } } while (!reader.EndOfStream); reader.Close(); reader.Dispose(); }