コード例 #1
0
        public void Init()
        {
            marked            = false;
            chunk_plane_order = -1;
            tex_name          = DEFAULT_TEX_NAME;
#if OVERLOAD_LEVEL_EDITOR
            m_tag       = false;
            m_tex_gl_id = (Editor.EditorLoaded && level != null && level.editor.tm_level != null ? level.editor.tm_level.FindTextureIDByName(tex_name) : -1);
#endif
            deformation_preset = 0;
            deformation_height = 0f;
            Door = -1;

            for (int i = 0; i < NUM_VERTS; i++)
            {
                vert[i] = -1;
                uv[i]   = uv_default[i];
                uv2[i]  = new Vector2(0.0f, 0.0f);
                uv3[i]  = new Vector2(0.0f, 0.0f);
            }

            for (int i = 0; i < NUM_DECALS; i++)
            {
                decal[i] = new Decal(this, i);
            }

            for (int i = 0; i < NUM_EDGES; i++)
            {
                edge[i] = new Edge();
            }
        }
コード例 #2
0
        public void BuildClipPlanes()
        {
            if (editor.m_decal_active == -1)
            {
                return;
            }

            GL.PushMatrix();
            GL.DeleteLists(GL_CLIP_PLANES, 1);
            GL.NewList(GL_CLIP_PLANES, ListMode.Compile);
            {
                GL.Begin(PrimitiveType.Lines);
                if (editor.m_level.selected_segment > -1 && editor.m_level.selected_side > -1)
                {
                    Side  s = editor.m_level.segment[editor.m_level.selected_segment].side[editor.m_level.selected_side];
                    Decal d = s.decal[editor.m_decal_active];
                    for (int i = 0; i < Decal.NUM_EDGES; i++)
                    {
                        if (d.clip_normal[i] != Vector3.Zero)
                        {
                            GL.Color3(C_decal_clip[i]);
                            CreateLine(s.FindEdgeCenter(i), s.FindEdgeCenter(i) + d.clip_normal[i] * CLIP_DIST);
                            CreateLine(s.FindEdgeCenterOffset(i, 0.1f), s.FindEdgeCenterOffset(i, 0.1f) + d.clip_normal[i] * CLIP_DIST);
                            CreateLine(s.FindEdgeCenterOffset(i, 0.9f), s.FindEdgeCenterOffset(i, 0.9f) + d.clip_normal[i] * CLIP_DIST);
                            CreateLine(s.FindEdgeCenterOffset(i, 0.1f) + d.clip_normal[i] * CLIP_DIST, s.FindEdgeCenterOffset(i, 0.9f) + d.clip_normal[i] * CLIP_DIST);
                        }
                    }
                }

                GL.End();
            }

            GL.EndList();
            GL.PopMatrix();
        }
コード例 #3
0
 public GClipPlane(Decal d, int idx)
 {
     visible   = d.IsClipActive(idx);
     edge_pos1 = d.side.FindEdgeCenterOffset(idx, 0.25f);
     edge_pos2 = d.side.FindEdgeCenterOffset(idx, 0.75f);
     normal    = d.clip_normal[idx];
     whole     = (d.clip[idx] == DecalClip.WHOLE);
 }
        public void CopyDecalPropertiesToMarked(Decal src, int idx)
        {
            List <Side> side_list = GetMarkedSides();

            for (int i = 0; i < side_list.Count; i++)
            {
                side_list[i].decal[idx].Copy(src);
            }
        }
コード例 #5
0
        public void Copy(Decal src)
        {
            mesh_name = src.mesh_name;

            dmesh = src.dmesh;
            gmesh = src.gmesh;

            hidden   = src.hidden;
            align    = src.align;
            mirror   = src.mirror;
            rotation = src.rotation;
            repeat_u = src.repeat_u;
            repeat_v = src.repeat_v;
            offset_u = src.offset_u;
            offset_v = src.offset_v;

            for (int i = 0; i < NUM_EDGES; i++)
            {
                clip[i] = src.clip[i];
                cap[i]  = src.cap[i];
            }
        }
コード例 #6
0
        public void UpdateDecalLabels()
        {
            var editor = ActiveDocument;
            var level  = ActiveLevel;

            // Store decal controls in arrays so we can access them in a loop
            System.Diagnostics.Debug.Assert(Side.NUM_DECALS == 2);
            Button[] decal_marked_hide_buttons = new Button[] { button_decal_hide_marked1, button_decal_hide_marked2 };
            Button[] decal_copy_buttons        = new Button[] { button_decal_copy_1, button_decal_copy_2 };
            Button[] decal_hide_buttons        = new Button[] { button_decal_hide1, button_decal_hide2 };
            Label[]  decal_labels = new Label[] { label_decal1, label_decal2 };

            // Clear active decal if not active
            {
                var curr_selected_decal = level.GetSelectedDecal(editor.m_decal_active);
                if (curr_selected_decal == null || !curr_selected_decal.Applied)
                {
                    editor.m_decal_active = -1;
                }
            }

            //Needed below
            bool any_marked = ((level.num_marked_sides > 0) && !((level.num_marked_sides == 1) && (level.GetSelectedSide() != null) && level.GetSelectedSide().marked));

            //Update for each decal on a side
            for (int i = 0; i < Side.NUM_DECALS; i++)
            {
                //Determine if this decal is active
                Decal d       = level.GetSelectedDecal(i);
                bool  applied = d != null && d.Applied;

                //If there's no active decal but this one is applied, make it active
                if ((editor.m_decal_active == -1) && applied)
                {
                    editor.m_decal_active = i;
                }

                //Update labels, hide buttons, copy-to-marked buttons
                bool hidden = (applied && d.hidden);
                decal_labels[i].Text          = (hidden ? "HIDDEN " : "") + (i + 1) + ": " + (applied ? d.mesh_name : "-");
                decal_labels[i].BackColor     = (editor.m_decal_active == i) ? Color.Gold : SystemColors.ControlDark;
                decal_labels[i].Enabled       = applied;
                decal_hide_buttons[i].Text    = (hidden ? "Unhide" : "Hide") + (i + 1);
                decal_hide_buttons[i].Enabled = applied;
                decal_copy_buttons[i].Enabled = (applied && any_marked);

                //Update hide/unhide marked decal buttons
                bool         any_hidden            = false;
                List <Decal> marked_applied_decals = level.GetMarkedAppliedDecals(i);
                foreach (Decal decal in marked_applied_decals)
                {
                    if (decal.hidden)
                    {
                        any_hidden = true;
                        break;
                    }
                }
                decal_marked_hide_buttons[i].Enabled = (marked_applied_decals.Count > 0);
                decal_marked_hide_buttons[i].Text    = (any_hidden ? "Unhide" : "Hide") + " Marked Decals " + (i + 1);
            }

            // Update text of controls that are based on the active decal
            UpdateActiveDecalLabels();
        }
コード例 #7
0
        public void GenerateNonClippedGeometry(Decal d, DMesh dm)
        {
            // Limit max repeats based on the size of the face
            // NOTE: This may not the best way to limit repeats, but it works
            FindBaseAttributes(d);
            float max_length  = d.side.FindLongestDiagonal();
            int   max_repeats = 2 + (int)(max_length / 4f);

            int repeat_u = (d.repeat_u > 0 ? d.repeat_u : max_repeats);
            int repeat_v = (d.repeat_v > 0 ? d.repeat_v : max_repeats);

            int offset_u = d.offset_u;

            switch (d.align)
            {
            case DecalAlign.EDGE_RIGHT:
            case DecalAlign.EDGE_DOWN:
            case DecalAlign.EDGE_UP:
            case DecalAlign.EDGE_LEFT:
                // COMPATIBILITY: Due to a bug Offset U was effectively reversed in the original 1.0.1.0 release
                //                For backwards compatibility, retain this behaviour.
                offset_u = -offset_u;
                break;

            default:
                break;
            }

            // Get the implied offset based on the repeats
            int implied_offset_u = CalculateImpiedOffset(d.repeat_u, repeat_u);
            int implied_offset_v = CalculateImpiedOffset(d.repeat_v, repeat_v);

            // Adjust implied_offset_v for EDGE alignment (add 2)
            if (d.IsEdgeAlign())
            {
                implied_offset_v += 2;
            }

            // Temporary DMesh to hold the dm if it has to be mirrored
            DMesh temp_dm = new DMesh(dm.name);

            temp_dm.Copy(dm);
            temp_dm.MaybeFlip(d.mirror);

            // Create repeats of the geometry
            for (int i = 0; i < repeat_u; i++)
            {
                for (int j = 0; j < repeat_v; j++)
                {
                    // Before adding, must do WHOLE clipping (can't do it after because we don't have the data then)

                    // Create a CQuad that covers the outline of the expected area
                    Vector3[] v  = CreateGhostQuad(m_base_pos + m_base_rvec * (implied_offset_u - offset_u + i * 4) + m_base_uvec * (implied_offset_v + d.offset_v + j * 4), m_base_rot);
                    CTriangle ct = new CTriangle(v);

                    bool clip = false;
                    // See if that clips against a whole plane, if not add it
                    for (int k = 0; k < (int)EdgeOrder.NUM; k++)
                    {
                        if (m_clip_plane[k].whole)
                        {
                            ClipPlane cp = ClipPlane.CreateFrom3Points(m_clip_plane[k].edge_pos1, m_clip_plane[k].edge_pos2, m_clip_plane[k].edge_pos2 + m_clip_plane[k].normal);
                            if (ct.WouldBeClipped(cp))
                            {
                                clip = true;
                            }
                        }
                    }

                    if (!clip)
                    {
                        Vector3 offset  = m_base_rvec * (implied_offset_u - offset_u + i * 4) + m_base_uvec * (implied_offset_v + d.offset_v + j * 4);
                        Vector3 gcenter = m_base_pos + offset;
                        AddGeometry(temp_dm, gcenter);
                        AddLights(temp_dm, gcenter);
                    }
                }
            }

            // Add the textures
            for (int i = 0; i < dm.tex_name.Count; i++)
            {
                m_tex_name.Add(dm.tex_name[i]);
#if OVERLOAD_LEVEL_EDITOR
                m_tex_gl_id.Add(-1);
#endif
            }
        }
コード例 #8
0
        public void FindBaseAttributes(Decal d)
        {
            Side s = d.side;

            m_base_normal = s.FindNormal();

            // Center position
            switch (d.align)
            {
            case DecalAlign.TEXTURE:
                m_base_pos = s.FindUVCenterIn3D();
                break;

            case DecalAlign.CENTER:
                m_base_pos = s.FindCenter();
                break;

            case DecalAlign.EDGE_RIGHT:
            case DecalAlign.EDGE_DOWN:
            case DecalAlign.EDGE_LEFT:
            case DecalAlign.EDGE_UP:
                m_base_pos = s.FindEdgeCenter((int)d.align - (int)DecalAlign.EDGE_RIGHT);
                break;
            }

            m_base_rvec = Vector3.Zero;

            // Up vector
            switch (d.align)
            {
            case DecalAlign.TEXTURE:
                m_base_uvec = s.FindUVUpVector();
                break;

            case DecalAlign.CENTER:
                m_base_uvec = s.FindBestEdgeDir();
                break;

            case DecalAlign.EDGE_RIGHT:
            case DecalAlign.EDGE_DOWN:
            case DecalAlign.EDGE_LEFT:
            case DecalAlign.EDGE_UP:
                m_base_rvec = -s.FindEdgeDir((int)d.align - (int)DecalAlign.EDGE_RIGHT);
                m_base_uvec = Vector3.Cross(m_base_normal, m_base_rvec);
                break;
            }

            // Find the right vec for cases we haven't already
            if (m_base_rvec == Vector3.Zero)
            {
                m_base_rvec = Vector3.Cross(m_base_uvec, m_base_normal);
            }

            // Apply the rotation of the decal properties to the Up and Right Vector
            Matrix4 vec_rot = Matrix4.CreateFromAxisAngle(m_base_normal, d.RotationAngle());

            m_base_uvec = Vector3.TransformNormal(m_base_uvec, vec_rot);
            m_base_rvec = Vector3.TransformNormal(m_base_rvec, vec_rot);

            // Base rotation
            m_base_rot = Matrix4.Transpose(Matrix4.LookAt(Vector3.Zero, m_base_normal, m_base_uvec));
        }