Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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();
        }