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(); } }
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(); }
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); } }
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]; } }
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(); }
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 } }
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)); }