private IEv2_Zone m_zoneToUpdate; // Zone récemment ajoutée ou retirée (undo) #endregion Fields #region Methods //----------------------------------------------------- // Ajoute une zone de gommage / rétablissement public void AddZone(IEv2_Zone newZone) { // Fusionner les plus anciennes zones en une seule si la pile est pleine // while(m_erasedZones.Count > m_maxUndoCount) // MergeZones(); // Ajouter la zone aux zones enregistrées m_zoneToUpdate = newZone; m_zones.AddLast(m_zoneToUpdate); // m_backupZones.Add(m_zoneToUpdate.Clone()); m_undoedZones.Clear(); // Supprimer les zones annulées (plus de redo possible) m_needMaskUpdate = true; m_mainScene.GetComponent<PleaseWaitUI>().SetDisplayIcon(true); // SetVisible(true); }
private LinkedList<IEv2_Zone> m_zonesVec; // zones en vectoriel #endregion Fields #region Methods //---------------------------------------------------- public void AddZone(IEv2_Zone newZone) { m_zonesVec.AddLast(newZone); // -- Construction de la zone -- GrassV2zone gZone = newZone.RasterizeRGB(new Rect(0f, 0f, m_mask.width, m_mask.height)); if(newZone.GetMainColor() == Color.clear) gZone.m_textureID = -1; else gZone.m_textureID = m_grassSkybox.GetComponent<GrassHandler>().GetCurTexID(); gZone.m_texGen = m_grassSkybox.GetComponent<GrassHandler>().GetSynthTexGen(); // Debug.Log(DEBUGTAG+"Zone ADDED : "+gZone.m_textureID+", "+(gZone.m_texGen != null ? gZone.m_texGen.ToString() : "null")); m_grassBuffer = m_grassSkybox.GetComponent<GrassHandler>().GetGrassImage(m_maskSizeDiv, gZone.m_bounds); // m_grassBuffer.Apply(false); // debug : pour voir la texture dans l'inspecteur if(newZone.GetMainColor() != Color.clear) { List<MaskPixRGB> pix = gZone.m_pixels; for(int i=0; i<pix.Count; i++) { int x = pix[i].GetX() - (int)gZone.m_bounds.x; int y = pix[i].GetY() - (int)gZone.m_bounds.z; pix[i].SetColor(m_grassBuffer.GetPixel(x, y)); } } // Debug.Log (DEBUGTAG+"ADDING Zone : "+pix.Count+" pixels"); m_updatedZone = gZone; m_zones.AddLast(m_updatedZone); m_backupZones.Add(new GrassV2zone(gZone)); m_undoedZones.Clear(); // Supprimer zones annulées (plus de redo possible) m_needMaskUpdate = true; m_zoneAdded = true; m_mainScene.GetComponent<PleaseWaitUI>().SetDisplayIcon(true); SetVisible(true); }
//----------------------------------------------------- private IEnumerator UpdateMask(IEv2_Zone newZone, bool apply) { m_updatingCount++; Rect bgRect = m_backgroundImg.GetComponent<GUITexture>().pixelInset; List<MaskPix> pixels = newZone.Rasterize(bgRect); Color pixCol = Color.clear; for(int i=0; i<pixels.Count; i++) { int x = (int)(pixels[i].GetX()/(float)m_maskSizeDiv); int y = (int)(pixels[i].GetY()/(float)m_maskSizeDiv); pixCol.a = pixels[0].GetA(); // m_mask.SetPixel(x, y, pixCol); for(int j=0; j<m_maskSizeDiv; j++) for(int k=0; k<m_maskSizeDiv; k++) m_mask.SetPixel(x+j, y+k, pixCol); } // foreach pixel if(apply) StartCoroutine(ApplyMask()); m_zoneToUpdate = null; m_updatingCount--; yield return null; }
//----------------------------------------------------- void Start() { if(m_mainScene == null) Debug.LogError(DEBUGTAG+"MainScene" +PC.MISSING_REF); if(m_mainCam == null) Debug.LogError(DEBUGTAG+"MainCam" +PC.MISSING_REF); if(m_backgroundImg == null) Debug.LogError(DEBUGTAG+"Background Img" +PC.MISSING_REF); if(m_eraserV2mat == null) Debug.LogError(DEBUGTAG+"Eraser material"+PC.MISSING_REF); m_zones = new LinkedList<IEv2_Zone>(); m_undoedZones = new Stack<IEv2_Zone>(); // m_backupZones = new List<IEv2_Zone>(); m_mask = null; // Mask initialisé dans Reset (appelé par d'autres modules OS3D) m_needMaskUpdate = false; m_updatingCount = 0; m_needMaskApply = false; m_zoneToUpdate = null; // Reset(); // TODO virer ce reset quand dev fini !! DEV ONLY !! // m_model = Montage.sum; }
//----------------------------------------------------- public void Redo() { if(m_undoedZones.Count > 0) { m_zones.AddLast(m_undoedZones.Pop()); // m_backupZones.Add(CloneZone(m_erasedZones.Last.Value)); m_mainScene.GetComponent<PleaseWaitUI>().SetDisplayIcon(true); m_needMaskUpdate = true; m_zoneToUpdate = m_zones.Last.Value; } else Debug.Log(DEBUGTAG+"Aucune action à refaire"); }