Skip to content

Commit

Permalink
カラーピッカー対応
Browse files Browse the repository at this point in the history
- カラーピッカー対応
- パートカラー変更機能追加
- リファクタリング
  - ColorUtil, EditRange, ACCBoneSlotViewなどを別ファイルに分類
  - EditValueBaseを抽象クラスとして分離
  - 細々修正
  • Loading branch information
trzr committed Aug 11, 2018
1 parent 0914f89 commit 662afb9
Show file tree
Hide file tree
Showing 22 changed files with 1,670 additions and 448 deletions.
188 changes: 36 additions & 152 deletions CM3D2.AlwaysColorChangeEx.Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ private enum MenuType {
Texture,
MaidSelect,
BoneSlotSelect,
PartsColor,
}
private const string TITLE_LABEL = "ACCex : ";
private const int WINID_MAIN = 20201;
Expand Down Expand Up @@ -128,6 +129,8 @@ private enum MenuType {
private List<ACCMaterialsView> materialViews;
private List<ACCTexturesView> texViews;
private ACCSaveMenuView saveView;
private ACCBoneSlotView boneSlotView;
private ACCPartsColorView partsColorView;

// 選択画面の一時選択状態のメイド情報
private Maid selectedMaid;
Expand All @@ -140,23 +143,15 @@ private enum MenuType {
private string tips;

// BoneRender
private CustomBoneRenderer boneRenderer;
private int selectedSlotID;
private bool boneVisible;
private bool skipEmptySlot = true;
private readonly string[] slotNames;
private SliderHelper sliderHelper;
private CheckboxHelper cbHelper;
private EditColor editColor = new EditColor(Color.white, ColorType.rgba, EditColor.RANGE, EditColor.RANGE);
private bool editExpand;
private readonly GUIColorStore colorStore = new GUIColorStore();

// private SlotCache[] slotCaches;
#endregion

public AlwaysColorChangeEx() {
mouseDowned = false;
plugin = this;
slotNames = CreateSlotNames();

}

#region MonoBehaviour methods
Expand Down Expand Up @@ -190,12 +185,16 @@ public void Awake() {
ShaderPropType.Initialize();
//var go = new GameObject("BoneRenderer");
//boneRenderer = go.AddComponent<CustomBoneRenderer>();
boneRenderer = new CustomBoneRenderer();

sliderHelper = new SliderHelper(uiParams);
cbHelper = new CheckboxHelper(uiParams);

#if UNITY_5_5_OR_NEWER
SceneManager.sceneLoaded += SceneLoaded;
#endif
saveView = new ACCSaveMenuView(uiParams);
boneSlotView = new ACCBoneSlotView(uiParams, sliderHelper);
partsColorView = new ACCPartsColorView(uiParams, sliderHelper);
// for (var i = 0; i < SceneManager.sceneCountInBuildSettings; ++i) {
// var scene = SceneUtility.GetScenePathByBuildIndex(i);
// LogUtil.Debug(i, ":", scene);
Expand Down Expand Up @@ -233,7 +232,8 @@ public void OnLevelWasLoaded(int level) {
public void OnSceneLoaded(int level) {
fPassedTime = 0f;
bUseStockMaid = false;
if (boneRenderer != null) boneRenderer.Clear();
boneSlotView.Clear();
partsColorView.Clear();

if ( !checker.IsTarget(level) ) {
if (!isActive) return;
Expand Down Expand Up @@ -272,7 +272,7 @@ public void Update() {

// 選択中のメイドが有効でなければ何もしない
if (!holder.CurrentActivated()) return;
if (boneRenderer != null) boneRenderer.Update();
boneSlotView.Update();

if (toApplyPresetMaid != null && !toApplyPresetMaid.IsBusy) {
var targetMaid = toApplyPresetMaid;
Expand Down Expand Up @@ -332,7 +332,7 @@ public void OnGUI() {
} else if (ACCTexturesView.fileBrowser != null) {
uiParams.fileBrowserRect = GUI.Window(WINID_DIALOG, uiParams.fileBrowserRect, DoFileBrowser, Version, uiParams.winStyle);

} else if (saveView != null && saveView.showDialog) {
} else if (saveView.showDialog) {
uiParams.modalRect = GUI.ModalWindow(WINID_MAIN, uiParams.modalRect, DoSaveModDialog, "menuエクスポート", uiParams.dialogStyle);

} else {
Expand Down Expand Up @@ -361,6 +361,9 @@ public void OnGUI() {
case MenuType.BoneSlotSelect:
uiParams.winRect = GUI.Window(WINID_MAIN, uiParams.winRect, DoSelectBoneSlot, Version, uiParams.winStyle);
break;
case MenuType.PartsColor:
uiParams.winRect = GUI.Window(WINID_MAIN, uiParams.winRect, DoChangePartsColor, Version, uiParams.winStyle);
break;
case MenuType.MaidSelect:
uiParams.winRect = GUI.Window(WINID_MAIN, uiParams.winRect, DoSelectMaid, Version, uiParams.winStyle);
break;
Expand Down Expand Up @@ -445,15 +448,15 @@ private void UpdateCameraControl() {
var cursor = new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y);
cursorContains = uiParams.fileBrowserRect.Contains(cursor);
if (!cursorContains) {
if (saveView != null && saveView.showDialog) {
if (saveView.showDialog) {
cursorContains = uiParams.modalRect.Contains(cursor);
}
}
} else if (menuType != MenuType.None) {
var cursor = new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y);
cursorContains = uiParams.winRect.Contains(cursor);
if (!cursorContains) {
if (saveView != null && saveView.showDialog) {
if (saveView.showDialog) {
cursorContains = uiParams.modalRect.Contains(cursor);
}
}
Expand Down Expand Up @@ -481,11 +484,8 @@ private void Dispose() {
ResourceHolder.Instance.Clear();
//OnDestroy();

if (boneRenderer != null) {
boneRenderer.Clear();
//UnityEngine.Object.Destroy(boneRenderer);
boneRenderer = null;
}
boneSlotView.Dispose();
partsColorView.Dispose();
initialized = false;
}

Expand Down Expand Up @@ -732,6 +732,9 @@ private void DoMainMenu(int winID) {
if (GUILayout.Button("ボーン表示", uiParams.bStyle, uiParams.optSubConHalfWidth)) {
SetMenu(MenuType.BoneSlotSelect);
}
if (GUILayout.Button("パートカラー変更", uiParams.bStyle, uiParams.optSubConHalfWidth)) {
SetMenu(MenuType.PartsColor);
}
} finally {
GUILayout.EndHorizontal();
}
Expand Down Expand Up @@ -934,8 +937,6 @@ private void ExportMenu() {
var prop = holder.CurrentMaid.GetProp(holder.CurrentSlot.mpn);
if (prop == null) return;
{
if (saveView == null) saveView = new ACCSaveMenuView(uiParams);

// 変更可能なmenuファイルがない場合は保存画面へ遷移しない
var targetSlots = saveView.Load(prop.strFileName);
if (targetSlots == null) {
Expand Down Expand Up @@ -1582,144 +1583,27 @@ private void DoSaveModDialog(int winId) {
GUI.DragWindow(uiParams.titleBarRect);
}

private string[] CreateSlotNames() {
var allSlotNames = Enum.GetNames(typeof(TBody.SlotID));
const int max = (int)TBody.SlotID.moza;
var items = new string[max];
var idx = 0;
foreach (var slot in allSlotNames) {
if (idx >= max) break;
items[idx++] = slot;
private void DoSelectBoneSlot(int winId) {
try {
boneSlotView.Show();
} finally {
if (GUILayout.Button("閉じる", uiParams.bStyle, uiParams.optSubConWidth, uiParams.optBtnHeight)) {
SetMenu(MenuType.Main);
}
GUI.DragWindow(uiParams.titleBarRect);
}
LogUtil.Debug("slotNames", items);
return items;
}

private void DoSelectBoneSlot(int winID) {
GUILayout.BeginVertical();
var titleWidth = GUILayout.Width(uiParams.fontSize * 20f);
var titleHeight = GUILayout.Height(uiParams.titleBarRect.height);
private void DoChangePartsColor(int winId) {
try {
GUILayout.BeginHorizontal();
GUILayout.Label("ボーン表示用スロット 選択", uiParams.lStyleB, titleWidth, titleHeight);
GUILayout.EndHorizontal();

var maid = holder.CurrentMaid;
if (maid == null) return;
if (maid.IsBusy) {
GUILayout.Space(100);
GUILayout.Label("変更中...", uiParams.lStyleB);
GUILayout.Space(uiParams.colorRect.height - 105);
return;
}
if (boneRenderer.IsEnabled()) {
// 選択メイドが変更された場合に一旦クリア
if (boneRenderer.TargetId != maid.GetInstanceID()) {
boneRenderer.Clear();
boneVisible = false;
}
}
if (sliderHelper.setColorSlider(" 色設定", ref editColor, editColor.type, SliderHelper.DEFAULT_PRESET, ref editExpand)) {
boneRenderer.Color = editColor.val;
}

if ((int)TBody.SlotID.end - 1 > maid.body0.goSlot.Count) return;

var width = uiParams.colorRect.width - 30;
var offset = editExpand ? uiParams.unitHeight * 5f : uiParams.itemHeight-uiParams.margin*3f;
var height = uiParams.winRect.height - uiParams.itemHeight * 3f - offset - uiParams.titleBarRect.height;
var toggleWidth = GUILayout.Width(width * 0.4f);
var otherWidth = GUILayout.Width(width * 0.6f);
GUILayout.BeginHorizontal();
try {
GUI.enabled = selectedSlotID != -1 && boneRenderer.IsEnabled();
string buttonText;
if (boneVisible) {
colorStore.SetColor(Color.white, Color.green);
buttonText = "ボーン表示";
} else {
buttonText = "ボーン非表示";
}
if (GUILayout.Button(buttonText, uiParams.bStyle, uiParams.optBtnHeight, toggleWidth)) {
boneVisible = !boneVisible;
boneRenderer.SetVisible(boneVisible);
var slot = maid.body0.goSlot[selectedSlotID];
if (boneVisible && !boneRenderer.IsEnabled() && slot != null && slot.obj != null) {
boneRenderer.Setup(slot.obj, slot.RID);
boneRenderer.TargetId = maid.GetInstanceID();
}
}
colorStore.Restore();
GUI.enabled = true;
if (skipEmptySlot) {
colorStore.SetColor(Color.white, Color.green);
buttonText = "空スロット省略";
} else {
buttonText = "全スロット表示";
}
if (GUILayout.Button(buttonText, uiParams.bStyle, uiParams.optBtnHeight, toggleWidth)) {
skipEmptySlot = !skipEmptySlot;
}
colorStore.Restore();
} finally {
GUILayout.EndHorizontal();
}
scrollViewPosition = GUILayout.BeginScrollView(scrollViewPosition,
GUILayout.Width(uiParams.colorRect.width),
GUILayout.Height(height));
try {
for (var i = 0; i < slotNames.Length; i++) {
var slotItem = maid.body0.goSlot[i];
var slotEnabled = (slotItem.obj != null && slotItem.morph != null);
if (skipEmptySlot && !slotEnabled) continue;

GUILayout.BeginHorizontal();
try {
GUI.enabled = slotEnabled;
var selected = (i == selectedSlotID);
var toggleOn = GUILayout.Toggle(selected, slotNames[i], uiParams.tStyleS, toggleWidth);
if (toggleOn) {
if (selected) {
if (slotItem.obj != null) {
// 既に選択済の場合、アイテム変更チェック
if (boneRenderer.ItemID != slotItem.RID) {
boneRenderer.Setup(slotItem.obj, slotItem.RID);
boneRenderer.SetVisible(boneVisible);
boneRenderer.TargetId = maid.GetInstanceID();
}
} else {
boneVisible = false;
}
} else {
selectedSlotID = i;
if (slotItem.obj != null) {
boneRenderer.Setup(slotItem.obj, slotItem.RID);
boneRenderer.SetVisible(boneVisible);
boneRenderer.TargetId = maid.GetInstanceID();
}
}
}
GUI.enabled = true;

if (slotEnabled) {
var modelName = slotItem.m_strModelFileName ?? string.Empty;
GUILayout.Label(modelName, uiParams.lStyleS, otherWidth);
}
} finally {
GUILayout.EndHorizontal();
}
}

} finally {
GUI.EndScrollView();
}
partsColorView.Show();
} finally {
GUILayout.EndVertical();
if (GUILayout.Button("閉じる", uiParams.bStyle, uiParams.optSubConWidth, uiParams.optBtnHeight)) {
SetMenu(MenuType.Main);
}
GUI.DragWindow(uiParams.titleBarRect);
}
}
}

}
}
24 changes: 19 additions & 5 deletions Data/ACCMaterial.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ public class ACCMaterial {
public string name;
public ShaderType type;

public EditValue renderQueue = new EditValue(2000f, EditRange.renderQueue);
public readonly EditValue renderQueue = new EditValue(2000, EditRange.renderQueue);

public EditColor[] editColors;
public ColorPicker[] pickers;
public EditValue[] editVals;

public string rqEdit;
Expand All @@ -47,6 +48,7 @@ public ACCMaterial(ACCMaterial src) {

// TODO 配列の中身はディープコピーとする
editColors = src.editColors;
pickers = src.pickers;
editVals = src.editVals;
}

Expand All @@ -73,11 +75,16 @@ private void InitType() {
// Color生成
var colProps = type.colProps;
editColors = new EditColor[colProps.Length];
pickers = new ColorPicker[colProps.Length];
var size = UIParams.Instance.itemHeight;
for (var i=0; i<colProps.Length; i++) {
var colProp = colProps[i];
var color = material != null ? material.GetColor(colProp.propId) : colProp.defaultVal;
var ec = new EditColor(color, colProp.colorType);
var ec = new EditColor(color, colProp.colorType, colProp.composition);
editColors[i] = ec;
var picker = new ColorPicker {ColorTex = new Texture2D(size, size, TextureFormat.RGB24, false)};
picker.SetTexColor(ref color);
pickers[i] = picker;
}

// float生成
Expand Down Expand Up @@ -122,26 +129,33 @@ public void Update(ShaderType sdrType) {
// 同一長の場合でも更新(Alphaの有無が異なるケースがある)
var colProps = sdrType.colProps;
var createdColors = new EditColor[colProps.Length];
var createdPickers = new ColorPicker[colProps.Length];
var size = UIParams.Instance.itemHeight;
for (var i=0; i<colProps.Length; i++) {
var colProp = colProps[i];
if (i < editColors.Length) {
// カラータイプが異なる場合は、インスタンスを作り直して色をコピー
if (editColors[i].type == colProp.colorType) {
createdColors[i] = editColors[i];
} else {
createdColors[i] = new EditColor(editColors[i].val, colProp.colorType);
createdColors[i] = new EditColor(editColors[i].val, colProp.colorType, colProp.composition);
}
createdPickers[i] = pickers[i];

} else {
Color color;
if (material != null) {
color = material.GetColor(colProp.propId);
} else {
color = (Original != null)? Original.GetColor(i): colProp.defaultVal;
}
createdColors[i] = new EditColor(color, colProp.colorType);
createdColors[i] = new EditColor(color, colProp.colorType, colProp.composition);
createdPickers[i] = new ColorPicker {ColorTex = new Texture2D(size, size, TextureFormat.RGB24, false)};
createdPickers[i].SetTexColor(ref createdColors[i].val);
}
}
editColors = createdColors;
pickers = createdPickers;

var props = sdrType.fProps;
var createdVals = new EditValue[props.Length];
Expand Down Expand Up @@ -176,6 +190,7 @@ public void SetColor(string propName, Color c) {
if (colProp.key != propKey) continue;

editColors[i].Set ( c );
pickers[i].SetTexColor(ref c);
return;
}
LogUtil.Debug("propName mismatched:", propName);
Expand Down Expand Up @@ -255,7 +270,6 @@ private static ACCMaterialEx Load(BinaryReader reader) {
//created.shader = created.type1.shader;

var shaderName2 = reader.ReadString();

while(true) {
var type = reader.ReadString();
if (type == "end") break;
Expand Down
Loading

0 comments on commit 662afb9

Please sign in to comment.