MOARdV

[1.3.1] RasterPropMonitor - still putting the 'A' in IVA (v0.29.2, 18 October 2017)

Recommended Posts

2 hours ago, Ser said:

@MOARdV, The MM patches work, it was me having messed up CUSTOM and MATH prefixes and looking at the wrong variable.

Are you sure the variable ELECOUTPUTALTERNATOR is calculated properly? I specified the rate of EC resource output for alternator as 2. My engine's part menu shows that current output rate is 1.88 EC/s. I'm sure that inside alternator logic it is calculated as outputResource.rate * some thrust coefficient.

I compared that equation to what I wrote for MAS (which was written from scratch), and they are different.  MAS uses only the outputRate field.  I don't remember why I included availableAlternatorOutput in the RPM implementation.  Looks like I need to queue that fix.

Share this post


Link to post
Share on other sites

@MOARdV, Ok. And I have a suggestion for your MAS: it would be nice to be able to set a property like "transition" for some variables that would introduce a smooth transition to a new value when it's changed. That transition would make gauge needles actually turn to the new value instead of jumping momentarily. I want to implement such behavior in NavUtilities and it would be cool to have it in MAS based props also. Quite a cosmetic feature but could be good for analog gauges and compasses to act more realistic.

Share this post


Link to post
Share on other sites
1 hour ago, Ser said:

@MOARdV, Ok. And I have a suggestion for your MAS: it would be nice to be able to set a property like "transition" for some variables that would introduce a smooth transition to a new value when it's changed. That transition would make gauge needles actually turn to the new value instead of jumping momentarily. I want to implement such behavior in NavUtilities and it would be cool to have it in MAS based props also. Quite a cosmetic feature but could be good for analog gauges and compasses to act more realistic.

Animated props that use translations or rotations to move needles / wheels / whatever already have the ability to transition like that, both in RPM and MAS.

Share this post


Link to post
Share on other sites

@MOARdV, Could you recommend a way to bypass adding my engine to RPM's availableEngines list? It is an engine in fact but I need it to be handled separately from all other engines.

I've thought of different ways to do it, but none is good: making it not a ModuleEngines will lead to re-implementing much of stock logic including alternator etc. Overriding engine handlers like ButtonEngineStart/State will lead to duplicating RPM's logic for all the other engines to work properly with props and variables. It would be great to have some kind of config where I could specify that my module or part should not be automatically handled by RPM because of it's own logic.

Edited by Ser

Share this post


Link to post
Share on other sites
5 hours ago, Ser said:

@MOARdV, Could you recommend a way to bypass adding my engine to RPM's availableEngines list? It is an engine in fact but I need it to be handled separately from all other engines.

I've thought of different ways to do it, but none is good: making it not a ModuleEngines will lead to re-implementing much of stock logic including alternator etc. Overriding engine handlers like ButtonEngineStart/State will lead to duplicating RPM's logic for all the other engines to work properly with props and variables. It would be great to have some kind of config where I could specify that my module or part should not be automatically handled by RPM because of it's own logic.

Unfortunately, RPM doesn't have a way to exclude specific engines.  There have been requests for individual engines to be controlled/tracked separately (or grouped together and controlled as a group), but the complexity of it would not fit RPM's design without a tremendous amount of effort, and I don't have the time and motivation to retrofit it to RPM and maintain it.

Share this post


Link to post
Share on other sites
58 minutes ago, MOARdV said:

Unfortunately, RPM doesn't have a way to exclude specific engines.  There have been requests for individual engines to be controlled/tracked separately (or grouped together and controlled as a group), but the complexity of it would not fit RPM's design without a tremendous amount of effort, and I don't have the time and motivation to retrofit it to RPM and maintain it.

What do you think about having just a plain config to specify the ignored names? Something like this:

RPM_IGNORE
{
	partName = MyOwnPart1
	partName = MyOwnPart2
	moduleName = MyOwnModule
	..... etc .....
}

Those nodes might be loaded and parsed as a string list on RPM's Awake and then checked every time in UpdateVariables method whether the module in question is listed or not prior to adding to availableXXXX lists. As I see, the most of handling logic relies on these lists' contents. And the entire separate handling implementation will be on my side. Will it still require complex changes?

I could make a PR if you're interested in merging it to RPM.

Edited by Ser

Share this post


Link to post
Share on other sites
On 10/17/2017 at 8:56 AM, Ser said:

I could make a PR if you're interested in merging it to RPM.

I'd like to see the implementation you're proposing.  The way I'm reading it, the UpdateVariables method would have to check every single part to see if it's in the IGNORE list, and, if it is, check every single module to see if it's in the IGNORE list as well, unless I misunderstand how you intend it to work.  Depending on the complexity of the change, it could go into v0.29.3.

In related news, I've pushed v0.29.2 into the wild.  This update includes a couple of bug fixes, as well as a new MODULO math operator.  Full release notes on the Github Releases page.

IVA Makers: If you have MFDs that use the old 'cameraTransform' parameter to draw camera views, as opposed to the 'JSISteerableCamera' background handler, you will need to update those MFD pages before v0.30.0, whenever that happens (most likely if there's a KSP 1.4.0, or if a minor release forces an RPM re-compile).  'cameraTransform' support is deprecated in v0.29.2, and it will be removed in v0.30.0.

Share this post


Link to post
Share on other sites
34 minutes ago, MOARdV said:

I'd like to see the implementation you're proposing.  The way I'm reading it, the UpdateVariables method would have to check every single part to see if it's in the IGNORE list, and, if it is, check every single module to see if it's in the IGNORE list as well, unless I misunderstand how you intend it to work.  Depending on the complexity of the change, it could go into v0.29.3.

A bit simpler. UpdateVariables already looks at every single module and decides where to add it. I'm going just to add additional check whether the module or its part is listed in the ignore list.

Edited by Ser

Share this post


Link to post
Share on other sites
1 hour ago, Ser said:

A bit simpler. UpdateVariables already looks at every single module and decides where to add it. I'm going just to add additional check whether the module or its part is listed in the ignore list.

I'm not keen on an unconstrained check for modules - that means that a stray RPM_IGNORE with a given module disables all parts, for all craft, that use that module.  And that leads to bug reports of "Feature X in RPM isn't working" because the player likely won't be aware of the override.  If the feature is scoped to "Ignore Module X on Part Y", the scope is more tightly controlled, and it'll be less likely to have side-effects on other parts.

Share this post


Link to post
Share on other sites
15 minutes ago, MOARdV said:

I'm not keen on an unconstrained check for modules - that means that a stray RPM_IGNORE with a given module disables all parts, for all craft, that use that module.  And that leads to bug reports of "Feature X in RPM isn't working" because the player likely won't be aware of the override.  If the feature is scoped to "Ignore Module X on Part Y", the scope is more tightly controlled, and it'll be less likely to have side-effects on other parts.

What do you think of using the following syntax:

To ignore the whole part:

name = MyPartName.*

or to ignore a single module:

name = MyPartName.AnyModuleName

And I think ignored parts shouldn't be ignored by FetchPerPartData() method because it calculates part temperatures etc. Can't imagine the case when someone would want to skip that.

Edited by Ser

Share this post


Link to post
Share on other sites
2 hours ago, Ser said:

What do you think of using the following syntax:

To ignore the whole part:


name = MyPartName.*

or to ignore a single module:


name = MyPartName.AnyModuleName

And I think ignored parts shouldn't be ignored by FetchPerPartData() method because it calculates part temperatures etc. Can't imagine the case when someone would want to skip that.

I think that would be a better-defined approach.  A per-part opt-in (even if it's "All modules on this part") will minimize the likelihood of surprises.

Share this post


Link to post
Share on other sites

@MOARdV, the PR is out. Another one I'd like to do is multiple action handlers, just load and treat them as an array. This would allow third party plugins to use MM to "register" additional action handlers on existing props just like listeners instead of writing weird code that replaces an existing handler and then uses reflection to chain the original one. Don't you mind?

Edited by Ser

Share this post


Link to post
Share on other sites

I'm having continual problems with KSP  crashing entering or leaving the VAB. I looked into my logs and removed a few things that cleaned up the log almost entirely, but the crashes continued, if anything they've gotten more frequent.

Frustrating thing was last several crashes the crash directory had been created but was empty. It just crashed again, this time fortunately we have a log. Looking in there, the only exceptions I see are some from SSTU not playing well with Ferram (I asked about those in the SSTU thread), but also quite a few from RPM having a problem with Procedural Parts. It may be a PP problem, not sure. Any advice would be appreciated. I'm still on KSP 1.30 and the latest 1.30 versions of RPM and PP.

Spoiler

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

 

Share this post


Link to post
Share on other sites
8 hours ago, vossiewulf said:

I'm having continual problems with KSP  crashing entering or leaving the VAB. I looked into my logs and removed a few things that cleaned up the log almost entirely, but the crashes continued, if anything they've gotten more frequent.

Frustrating thing was last several crashes the crash directory had been created but was empty. It just crashed again, this time fortunately we have a log. Looking in there, the only exceptions I see are some from SSTU not playing well with Ferram (I asked about those in the SSTU thread), but also quite a few from RPM having a problem with Procedural Parts. It may be a PP problem, not sure. Any advice would be appreciated. I'm still on KSP 1.30 and the latest 1.30 versions of RPM and PP.

  Reveal hidden contents

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

Exception handling event onVesselWasModified in class RPMVesselComputer:System.NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
 
(Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)

NullReferenceException: Object reference not set to an instance of an object
  at JSI.RPMVesselComputer.onVesselWasModified (.Vessel who) [0x00000] in <filename unknown>:0 
  at EventData`1[Vessel].Fire (.Vessel data) [0x00000] in <filename unknown>:0 
UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object)
UnityEngine.DebugLogHandler:LogException(Exception, Object)
UnityEngine.Logger:LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
EventData`1:Fire(Vessel)
ProceduralParts.ProceduralPart:OnPartColliderChanged()
BaseEvent:Invoke(BaseEventDetails)
Part:SendEvent(String, BaseEventDetails, Int32)
ProceduralParts.ProceduralAbstractShape:ColliderChanged()
ProceduralParts.ProceduralAbstractShape:RaiseModelAndColliderChanged()
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(LinkedList`1)
ProceduralParts.ProceduralAbstractSoRShape:WriteMeshes(ProfilePoint[])
ProceduralParts.ProceduralShapeCone:UpdateShape(Boolean)
ProceduralParts.ProceduralAbstractShape:OnUpdateEditor()
ProceduralParts.ProceduralPart:InitializeNodes()
ProceduralParts.ProceduralPart:DoInitialize()
ProceduralParts.ProceduralPart:OnInitialize()
Part:InitializeModules()
ShipConstruct:LoadShip(ConfigNode)
ShipConstruction:LoadShip(String)
FlightDriver:Start()
 
(Filename:  Line: -1)

 

I'm afraid the only advice I have is update to 1.3.1 and see if it reproduces in that environment.  I don't support previous versions of KSP.

Share this post


Link to post
Share on other sites

@MOARdV Question 1: is it possible to create a camera that is recognized by other RPM screens (ASET, B9) as internal/landing cameras? I've noticed that ASET uses 

cameraTransform = ALCORExt_B_CamTransform|ALCORExt_A_CamTransform|ALCORExt_C_CamTransform|ALCORExt_D_CamTransform|ExtCam1

Meanwhile, RPM uses cameraIDPrefix = ExtCam in the camera cfg file, and then adds the camera ID through the object interface to get the ID and merge the name for its use:

cameraTransform = ExtCam1|ExtCam2|ExtCam3|ExtCam4|ExtCam5|ExtCam6|ExtCam7|ExtCam8

Now, instead of doing that, can't you allow us to go through actual names directly, such as "Ext Cam1 -> Ext Cam 2 -> ALCORExt_B_CamTransform -> B9_something_camera" instead of going "ID 1,2,3,4,5" etc? Preferably the list would be drawn from a cfg file where we can add other camera names ourselves if needed?

 

Question 2: I've never seen anyone use the Monochrome shader, and that's a really lost opportunity here. Currently, they have to be defined per screen, but why not do it per part? You'd need the following features (bear in mind I'm not a Kerbal programmer, so this is purely pseudo-code):

- add a new variable to the JSI External Camera and docking port cameras

MODULE
	{
		name = JSIExternalCameraSelector
		cameraContainer = RCSthruster
		rotateCamera = -90,0,0
		cameraIDPrefix = ExtCam  //this one wouldn't do anything anymore, actually

	//from the suggestion before:
		cameraIDs = ExtCam1,ExtCam2,ExtCam3, ALCORExt_B_CamTransform, Karamazov_really_weird_camera

	// now the new one
        RPMcustomCameras
		{
			EarlyBW { unlockTechs = flightControl } 
			ModernCamera { unlockTechs = unmannedTech }
			KaramazovWasHERE {unlockTechs = start}
		}

	}

- one library file, let's say "RPM_Custom_Camera_Shaders.cfg" that would look sort of like this:

RPMCUSTOMCAMERA {
		name = earlyBW
		Description = MOARdv's BW Russian 1950s
		// all the rest from here are optional, any missing ones would be used directly from the MFD Screen config file		
		rpmcustomshaders = BWheavyNoise   (defined below)		
		yawLimits =....
		yawRate = ...
		yawLeft = ....
		yawRight = .....
		pitchLimits = .....
		pitchRate = .....
		pitchUp = ......
		pitchDown = .....	
		
		  }

RPMCUSTOMCAMERA {
		Name = ModernCamera
		Description = Camera with steering and NV
		rpmcustomshaders = ColorClean, BWClean, NightVisionBWLowGainLowNoise, NightVisionGREENHighGainHighNoise   (all defined below)
		......
		}

RPMCUSTOMCAMERA {
		Name = KaramazovWasHERE
		Description = Karamazov's new OP CANIKON telescope I just added myself
		....
}

etc... you get the idea, Now for the shaderrs themselves:
RPMCUSTOMSHADER {
		name = BWheavyNoise
		cameraEffectShader = ....
	    cameraEffectVariables = ....
		cameraEffectTextures = ....	
}
RPMCUSTOMSHADER {
		name = NightVisionGREENHighGainHighNoise
		cameraEffectShader = ....
	    cameraEffectVariables = ....
		cameraEffectTextures = ....	
}

etc. etc.

This would allow you to create presets (at least to show us what's possible) and allow us to add more. The plugin would look at the camera's available shader/steer/zoom presets and if they're unlocked in the techtree, will show them to the Right click menu in the VAB/SPH (but not in flight, hehe) and allow us to select one of them. The first one should be "Default RPM camera" which would just be empty and look at the MFD40x20.cfg file. For the rest, once set, the plugin would load the settings in their definition, and fill up what's missing with the default values from the MFD40x20 file. 

- finally, assign a new task in the MFD40x20.cfg file to allow the user to scroll through the filters available for that model. Example: nextShader = 8, prevShader = 7 or whatever (I recommend the circle button anyway (and only nextShader is required, since cameras will not use 100 fulters)

This would instantly allow us to create a mod with various cameras, ranging from old grainy black and white ones to new ones, and unlock them through the career.

 

How does that sound? Possible? Doable? If done like this, it wouldn't affect any existing mod that uses RPM. They'd all work as they currently do, if the player chooses "Default RPM camera" and he'd have all current "ExtCam1, ExtCam2 etc." names available from the start. ASET and B9 would just have to add in a line in their screen configs to add in the new "nextShader, prevShader" function/buttons.

EDIT: Finally done editing, I must've rewritten it 100 times :)

Edited by karamazovnew

Share this post


Link to post
Share on other sites
2 hours ago, karamazovnew said:

Question 1: is it possible to create a camera that is recognized by other RPM screens (ASET, B9) as internal/landing cameras?

A bit of background: The original RPM implementation had cameras defined as external parts (eg, the ExtCam part included with RPM), with a simple module on the part to identify them numerically.  It could have been implemented as a "Name the camera" module, where each part could have a unique name that the user typed in.  The downside to that approach is it has a slightly steeper learning curve, since the player would have to know in advance what the supported camera names were, and then make sure the camera parts were appropriately named in the VAB.  That adds a lot of support overhead, since there will be frequent "How do I make the cameras work?" questions.  (Incidentally, the "Name the camera" approach is what I implemented in MAS, but MAS also doesn't require the use of a hard-coded list of camera names - it can iterate through all of the cameras without knowing names in advance)

In the case of the ALCOR lander pods, alexustas tightly coupled the lander pod with the IVA.  The unusual (non-ExtCam) camera names all refer to transforms in the ALCOR lander, giving alexustas precise control over how that MFD works, and what it displays.

I suppose it would be possible to update RPM to allow arbitrary names in addition to the simple ExtCam# implementation.  Or, alternatively, to have a list of predefined camera names and require the user to select one for each installed camera (but see caveat later).  That could be dicey if the user picks names that correspond to transforms on a part, like the case of the ALCOR lander - RPM would have to know how to prioritize the duplicate names.

2 hours ago, karamazovnew said:

I've never seen anyone use the Monochrome shader, and that's a really lost opportunity here

Alexustas uses a monochrome shader for a CRT-styled display in one of his lander can IVAs, and he uses the noise/gain shaders for some of the other MFD views.  However, they're mostly in the currently unreleased update to the ASET Props and Avionics pack.  The props included with the RPM distribution are rather old, and the configs for them were written a few years ago, prior to the shaders being available.  I personally am not motivated to update the basic RPM IVAs and props, since I don't use them (my current IVAs all use the aforementioned ASET props pack).

It would be feasible to add support for switchable shaders, and even tie them in to the tech tree, although I'm a bit hesistant to go that route since a) I never play career, so I wouldn't be able to thoroughly test the feature, and b) it opens a can of worms with respect to restricting other features in RPM based on available tech.  Your proposal is well specified, and it would definitely be a way to add RPM features to earlier-era space flight without seeming totally out of place (I think there's a mod that actually uses more than one IVA, depending on the tech that was unlocked, but I don't remember which one that was)

Now, the caveat I mentioned earlier: I am no longer developing significant features for RPM.  I had a number of features I wanted to add to the mod, but I had to make a choice:

  • Change existing functionality and break IVAs other mod authors created until they updated (not happening).
  • Add new functionality that duplicates and enhances existing functionality (forcing me to maintain two similar code paths).
  • Start a new mod.

I went with the third option.  I'm keeping RPM functional for now while I get MOARdV's Avionics Systems tidied up for a stable release, but RPM is basically in maintenance mode.  I'm willing to accept new features if someone else submits a pull request on GitHub, but I don't have the time to develop and support major new features for this mod.

Share this post


Link to post
Share on other sites
43 minutes ago, MOARdV said:

Or, alternatively, to have a list of predefined camera names and require the user to select one for each installed camera (but see caveat later)

Yeap, that's what I meant. A normal player would just select a name from a predefined list, sort of how tank fuel switchers or procedural parts textures work. I see how an ID is much easier, since iyou can reforce the renumbering of cameras in case the player uses 2 cameras with the same name. Can of worms really :) 

But consider this as a request for MAS.

And speaking about MAS, I already see how to switch through multiple pages with the same button (ex, Navball, HSI). But in RPM you could make a huge tree of hierarchical screens with the CONTEXTREDIRECT method (ex, B9). Will that also be available in MAS?

Share this post


Link to post
Share on other sites
1 hour ago, karamazovnew said:

And speaking about MAS, I already see how to switch through multiple pages with the same button (ex, Navball, HSI). But in RPM you could make a huge tree of hierarchical screens with the CONTEXTREDIRECT method (ex, B9). Will that also be available in MAS?

I don't think there's anything as succinct as the CONTEXTREDIRECT config pages, but it should be quite possible using Lua scripting.

Share this post


Link to post
Share on other sites

Hi there!

mod looks awesome, but when I downloaded  it, Hud/cockpits stayed completely the same, the camera part even successfully loaded and is able to be placed  on all parts, you can even change the cameras identification. 

I am currently running 1.2.2 

Thanks so much! 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now