private static void DrawGraphAttribute(KeyValuePair <string, VarTracerGraphItData> kv) { GUILayout.Label("Graph:" + kv.Key, NameLabel); int colorIndex = kv.Value.mData.Count; foreach (var varBodyName in GetAllVariableBodyFromChannel(kv.Key)) { NameLabel.normal.textColor = Color.white; GUILayout.Label("LogicName:" + varBodyName, NameLabel); foreach (var entry in kv.Value.mData) { var variable = VarTracer.GetGraphItVariableByVariableName(entry.Key); VarTracerDataInternal g = entry.Value; if (variable.VarBodyName.Equals(varBodyName)) { if (kv.Value.mData.Count >= 1) { NameLabel.normal.textColor = g.mColor; } GUILayout.Label(" [Variable] " + entry.Key + ":" + g.mCurrentValue.ToString(VarTracerConst.NUM_FORMAT_2), NameLabel); } } var varBody = VarTracer.Instance.groups[varBodyName]; foreach (var eventName in varBody.EventInfos.Keys) { colorIndex++; NameLabel.normal.textColor = VarTracerUtils.GetColorByIndex(colorIndex); GUILayout.BeginHorizontal(); Color saveColor = GUI.backgroundColor; GUI.backgroundColor = NameLabel.normal.textColor; GUILayout.Button("", EventButtonStyle, GUILayout.Width(10)); GUI.backgroundColor = saveColor; var flag = EditorGUILayout.Toggle(varBody.EventInfos[eventName].IsCutFlag, GUILayout.Width(10)); if (flag != varBody.EventInfos[eventName].IsCutFlag) { varBody.EventInfos[eventName].IsCutFlag = flag; if (flag) { varBody.EventInfos[eventName].TimeStamp = VarTracerUtils.GetTimeStamp(); } } GUILayout.Label(" <Event> " + eventName, NameLabel); GUILayout.EndHorizontal(); } } if (kv.Value.mData.Count >= 1) { HoverText.normal.textColor = Color.white; GUILayout.Label("duration:" + (mWidth / kv.Value.XStep / VarTracerConst.FPS).ToString(VarTracerConst.NUM_FORMAT_3) + "(s)", HoverText, GUILayout.Width(140)); kv.Value.XStep = GUILayout.HorizontalSlider(kv.Value.XStep, 0.1f, 15, GUILayout.Width(160)); } }
public VarTracerDataInternal(int subgraph_index) { mDataInfos = new List <VarDataInfo>(); mMin = 0.0f; mMax = 0.0f; mCurrentValue = 0.0f; mColor = VarTracerUtils.GetColorByIndex(subgraph_index); }
public static void ResoloveJsonMsg(VarTracerJsonType resolved) { int variableCount = resolved.variableName.Length; if (variableCount != resolved.variableValue.Length) { Debug.LogErrorFormat("Parameter Resolove Json Error ,variableCount = {0}", variableCount); } int eventCount = resolved.eventName.Length; if (eventCount != resolved.eventDuration.Length || eventCount != resolved.eventDesc.Length) { Debug.LogErrorFormat("Parameter Resolove Json Error ,eventCount = {0}", eventCount); } long timeStamp = resolved.timeStamp; if (VarTracerNet.Instance.StartTimeStamp == 0) { VarTracerNet.Instance.StartTimeStamp = VarTracerUtils.GetTimeStamp(); VarTracerNet.Instance.NetDeltaTime = VarTracerNet.Instance.StartTimeStamp - timeStamp; } timeStamp += VarTracerNet.Instance.NetDeltaTime; bool hasLogicalName = !string.IsNullOrEmpty(resolved.logicName); for (int i = 0; i < variableCount; i++) { if (hasLogicalName) { DefineVariable(resolved.variableName[i], resolved.logicName); } UpdateVariable(timeStamp, resolved.variableName[i], resolved.variableValue[i]); } for (int i = 0; i < eventCount; i++) { if (hasLogicalName) { DefineEvent(resolved.eventName[i], resolved.logicName); } if (resolved.eventDuration[i] != -1) { SendEvent(timeStamp, resolved.eventName[i], resolved.eventDuration[i], resolved.eventDesc[i]); } } if (resolved.runingState == (int)VarTracerConst.RunningState.RunningState_Start) { StartVarTracer(); } else if (resolved.runingState == (int)VarTracerConst.RunningState.RunningState_Pause) { StopVarTracer(); } }
public bool Handle_VarTracerInfo(eNetCmd cmd, UsCmd c) { int groupCount = c.ReadInt32(); //NetUtil.Log("read group count: {0}.", groupCount); for (int i = 0; i < groupCount; i++) { var groupName = c.ReadString(); //NetUtil.Log("read group Name: {0}.", groupName); var variableCount = c.ReadInt32(); //NetUtil.Log("read var count : {0}.", variableCount); for (int j = 0; j < variableCount; j++) { var variableName = c.ReadString(); //NetUtil.Log("read variableName: {0}.", variableName); var sessionCount = c.ReadInt32(); //NetUtil.Log("read sessionCount: {0}.", sessionCount); for (int k = 0; k < sessionCount; k++) { long stamp = c.ReadLong(); if (VarTracerNet.Instance.StartTimeStamp == 0) { VarTracerNet.Instance.StartTimeStamp = VarTracerUtils.GetTimeStamp(); VarTracerNet.Instance.NetDeltaTime = VarTracerNet.Instance.StartTimeStamp - stamp; } stamp += VarTracerNet.Instance.NetDeltaTime; //NetUtil.Log("read stamp: {0}.", stamp); float value = c.ReadFloat(); //NetUtil.Log("read value: {0}.", value); VarTracerHandler.UpdateVariable(groupName, variableName, stamp, value); } } var eventCount = c.ReadInt32(); for (int j = 0; j < eventCount; j++) { var eventName = c.ReadString(); var sessionCount = c.ReadInt32(); for (int k = 0; k < sessionCount; k++) { long stamp = c.ReadLong(); float duration = c.ReadFloat(); VarTracerHandler.SendEvent(groupName, stamp, eventName, duration); } } } return(true); }
public void SendEvent(string groupName, string eventName, float duration) { var group = GetGroupByName(groupName); if (group == null) { return; } var eventParm = GetEventParmByName(group, eventName); if (eventParm == null) { return; } eventParm._stamp = VarTracerUtils.GetTimeStamp(); eventParm._duration = duration; }
public void SendJsonMsg(VarTracerJsonType vtjt) { if (vtjt.timeStamp == 0) { vtjt.timeStamp = VarTracerUtils.GetTimeStamp(); } lock (_locker) { if (isMainMsgList) { sendMsgList.Add(vtjt); } else { sendMsgTempList.Add(vtjt); } } }
public void SendVariable(string groupName, string variableName, float value) { var group = GetGroupByName(groupName); if (group == null) { return; } var varParm = GetVariableParmByName(group, variableName); if (varParm == null) { return; } varParm._stamp = VarTracerUtils.GetTimeStamp(); varParm._value = value; }
public static void DrawGraphs(Rect rect, EditorWindow window) { if (VarTracer.Instance) { bool isEditorPaused = EditorApplication.isPaused; CreateLineMaterial(); mLineMaterial.SetPass(0); int graph_index = 0; //use this to get the starting y position for the GL rendering Rect find_y = EditorGUILayout.BeginVertical(GUIStyle.none); EditorGUILayout.EndVertical(); int currentFrameIndex = VarTracerNet.Instance.GetCurrentFrameFromTimestamp(VarTracerUtils.GetTimeStamp()); if (isEditorPaused) currentFrameIndex = VarTracerNet.Instance.GetCurrentFrameFromTimestamp(VarTracerUtils.StopTimeStamp); float scrolled_y_pos = y_offset - mGraphViewScrollPos.y; if (Event.current.type == EventType.Repaint) { GL.PushMatrix(); float start_y = find_y.y; GL.Viewport(new Rect(0, 0, rect.width, rect.height - start_y)); GL.LoadPixelMatrix(0, rect.width, rect.height - start_y, 0); //Draw grey BG GL.Begin(GL.QUADS); GL.Color(new Color(0.2f, 0.2f, 0.2f)); foreach (KeyValuePair<string, VarTracerGraphItData> kv in VarTracer.Instance.Graphs) { float height = kv.Value.GetHeight(); GL.Vertex3(x_offset, scrolled_y_pos, 0); GL.Vertex3(x_offset + mWidth, scrolled_y_pos, 0); GL.Vertex3(x_offset + mWidth, scrolled_y_pos + height, 0); GL.Vertex3(x_offset, scrolled_y_pos + height, 0); scrolled_y_pos += (height + y_gap); } GL.End(); scrolled_y_pos = y_offset - mGraphViewScrollPos.y; //Draw Lines GL.Begin(GL.LINES); foreach (KeyValuePair<string, VarTracerGraphItData> kv in VarTracer.Instance.Graphs) { graph_index++; float height = kv.Value.GetHeight(); DrawGraphGridLines(scrolled_y_pos, mWidth, height, graph_index == mMouseOverGraphIndex); foreach (KeyValuePair<string, VarTracerDataInternal> entry in kv.Value.mData) { VarTracerDataInternal g = entry.Value; float y_min = kv.Value.GetMin(entry.Key); float y_max = kv.Value.GetMax(entry.Key); float y_range = Mathf.Max(y_max - y_min, 0.00001f); //draw the 0 line if (y_min != 0.0f) { GL.Color(Color.white); float y = scrolled_y_pos + height * (1 - (0.0f - y_min) / y_range); Plot(x_offset, y, x_offset + mWidth, y); } GL.Color(g.mColor); float previous_value = 0, value = 0; int dataInfoIndex = 0, frameIndex = 0; for (int i = 0; i <= currentFrameIndex; i++) { int dataCount = g.mDataInfos.Count; if (dataCount != 0) { int lastFrame = g.mDataInfos[dataCount - 1].FrameIndex; float lastValue = g.mDataInfos[dataCount - 1].Value; frameIndex = g.mDataInfos[dataInfoIndex].FrameIndex; if (dataInfoIndex >= 1) value = g.mDataInfos[dataInfoIndex - 1].Value; if (dataInfoIndex == 0 && i < frameIndex) value = 0; if (i >= frameIndex) { while (g.mDataInfos[dataInfoIndex].FrameIndex == frameIndex && dataInfoIndex < dataCount - 1) { dataInfoIndex++; } } if (i > lastFrame) value = lastValue; } else { value = 0; } if (i >= 1) { float x0 = x_offset + (i - 1) * kv.Value.XStep - kv.Value.ScrollPos.x; if (x0 <= x_offset - kv.Value.XStep) continue; if (x0 >= mWidth + x_offset) break; float y0 = scrolled_y_pos + height * (1 - (previous_value - y_min) / y_range); if (i == 1) { x0 = x_offset; y0 = scrolled_y_pos + height; } float x1 = x_offset + i * kv.Value.XStep - kv.Value.ScrollPos.x; float y1 = scrolled_y_pos + height * (1 - (value - y_min) / y_range); if (m_isDrawLine) Plot(x0, y0, x1, y1); else Plot(x0, y0, x0+1, y0+1); } previous_value = value; } } scrolled_y_pos += (height + y_gap); } GL.End(); scrolled_y_pos = y_offset - mGraphViewScrollPos.y; scrolled_y_pos = ShowEventLabel(scrolled_y_pos); GL.PopMatrix(); GL.Viewport(new Rect(0, 0, rect.width, rect.height)); GL.LoadPixelMatrix(0, rect.width, rect.height, 0); } mGraphViewScrollPos = EditorGUILayout.BeginScrollView(mGraphViewScrollPos, GUIStyle.none); graph_index = 0; mWidth = window.position.width - x_offset; foreach (KeyValuePair<string, VarTracerGraphItData> kv in VarTracer.Instance.Graphs) { graph_index++; float height = kv.Value.GetHeight(); float width = currentFrameIndex * kv.Value.XStep; if (width < mWidth) { width = mWidth - x_offset; } else { if (!EditorApplication.isPaused) kv.Value.ScrollPos = new Vector2(width - mWidth, kv.Value.ScrollPos.y); } GUIStyle s = new GUIStyle(); s.fixedHeight = height + y_gap; s.stretchWidth = true; Rect r = EditorGUILayout.BeginVertical(s); //skip subgraph title if only one, and it's the same. NameLabel.normal.textColor = Color.white; r.height = height + 50; r.width = width; r.x = x_offset - 35; r.y = (height + y_gap) * (graph_index - 1) - 10; if (kv.Value.mData.Count > 0) { GUILayout.BeginArea(r); GUILayout.BeginVertical(); float GraphGap = kv.Value.m_maxValue - kv.Value.m_minValue; float unitHeight = GraphGap / VarTracerConst.Graph_Grid_Row_Num; for (int i = 0; i < VarTracerConst.Graph_Grid_Row_Num + 1; i++) { GUILayout.Space(6); if (unitHeight == 0) EditorGUILayout.LabelField("",NameLabel); else EditorGUILayout.LabelField((kv.Value.m_maxValue - i * unitHeight).ToString(VarTracerConst.NUM_FORMAT_1),NameLabel); } GUILayout.BeginHorizontal(); kv.Value.ScrollPos = GUILayout.BeginScrollView(kv.Value.ScrollPos, GUILayout.Width(mWidth), GUILayout.Height(0)); GUILayout.Label("", GUILayout.Width(width), GUILayout.Height(0)); GUILayout.EndScrollView(); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.EndArea(); } DrawGraphAttribute(kv); ////Respond to mouse input! if (Event.current.type == EventType.MouseDrag && r.Contains(Event.current.mousePosition - Event.current.delta)) { if (Event.current.button == 0) { kv.Value.ScrollPos = new Vector2(kv.Value.ScrollPos.x + Event.current.delta.x, kv.Value.ScrollPos.y); } window.Repaint(); } EditorGUILayout.EndVertical(); } EditorGUILayout.EndScrollView(); } }
public static void StopVarTracer() { VarTracerUtils.StopTimeStamp = VarTracerUtils.GetTimeStamp(); m_isStart = false; EditorApplication.isPaused = true; }
private static float ShowEventLabel(float scrolled_y_pos) { foreach (KeyValuePair <string, VarTracerGraphItData> kv in VarTracer.Instance.Graphs) { float height = kv.Value.GetHeight(); List <EventData> sortedEventList = new List <EventData>(); int colorIndex = kv.Value.mData.Count; Dictionary <string, int> colorIndexDict = new Dictionary <string, int>(); foreach (var varBodyName in GetAllVariableBodyFromChannel(kv.Key)) { var varBody = VarTracer.Instance.groups[varBodyName]; foreach (var eventName in varBody.EventInfos.Keys) { var eventInfo = varBody.EventInfos[eventName]; colorIndex++; colorIndexDict.Add(eventName, colorIndex); foreach (var data in eventInfo.EventDataList) { if (eventInfo.IsCutFlag && data.TimeStamp > eventInfo.TimeStamp) { eventInfo.TimeStamp = data.TimeStamp; StopVarTracer(); break; } if (data.EventFrameIndex > 0) { float x = x_offset + data.EventFrameIndex * kv.Value.XStep - kv.Value.ScrollPos.x; if (x <= x_offset - kv.Value.XStep) { continue; } if (x >= mWidth + x_offset) { break; } sortedEventList.Add(data); } } sortedEventList.Sort((EventData e1, EventData e2) => { return(e1.EventFrameIndex.CompareTo(e2.EventFrameIndex)); }); float startY = scrolled_y_pos + height - VarTracerConst.EventStartHigh; Rect preEventRect = new Rect(0, startY, 0, VarTracerConst.EventButtonHeight); for (int i = 0; i < sortedEventList.Count; i++) { var currentEvent = sortedEventList[i]; GL.Color(Color.gray); int buttonWidth = 0; if (currentEvent.Duration == 0) { buttonWidth = (int)(VarTracerConst.INSTANT_EVENT_BTN_DURATION * VarTracerConst.FPS * kv.Value.XStep); } else { buttonWidth = (int)(VarTracerConst.INSTANT_EVENT_BTN_DURATION * VarTracerConst.FPS * kv.Value.XStep); } //buttonWidth = (int)(currentEvent.Duration * VarTracerConst.FPS * kv.Value.XStep); GUIStyle style = EventButtonStyle; float x = x_offset + currentEvent.EventFrameIndex * kv.Value.XStep - kv.Value.ScrollPos.x; Rect tooltip_r; if (IsEventBtnIntersect(x - buttonWidth / 2, preEventRect.x, buttonWidth, preEventRect.width)) { if (preEventRect.y > height + int.Parse(kv.Key) * (height + y_gap)) { tooltip_r = new Rect(x - buttonWidth / 2, startY, buttonWidth, VarTracerConst.EventButtonHeight); } else { tooltip_r = new Rect(x - buttonWidth / 2, preEventRect.y + VarTracerConst.EventButtonFixGap, buttonWidth, VarTracerConst.EventButtonHeight); } } else { tooltip_r = new Rect(x - buttonWidth / 2, startY, buttonWidth, VarTracerConst.EventButtonHeight); } preEventRect = tooltip_r; var saveColor = GUI.backgroundColor; GUI.backgroundColor = VarTracerUtils.GetColorByIndex(colorIndexDict[currentEvent.EventName]); GUI.Button(tooltip_r, currentEvent.EventName, style); if (Event.current.type == EventType.Repaint && tooltip_r.Contains(Event.current.mousePosition + new Vector2(0, m_controlScreenHeight))) { GUI.backgroundColor = Color.white; GUI.Label(new Rect(tooltip_r.x - 20, tooltip_r.y - 30, 110, 30), "name:" + currentEvent.EventName + "\n" + "duration:" + currentEvent.Duration + "\n", EditorStyles.textArea); } GUI.backgroundColor = saveColor; } } } scrolled_y_pos += (height + y_gap); } return(scrolled_y_pos); }
public static void StopVarTracer() { VarTracerUtils.StopTimeStamp = VarTracerUtils.GetTimeStamp(); m_isPaused = true; }